首页 > 解决方案 > 浮动/双发行 x64/x86

问题描述

当涉及到 C# 中的 x64 和 x86 平台时,我在 Double/Float 上有一些奇怪的行为。

一个简单的测试在这里:

float testVar= 50;
double test = 1/ testVar* 1e6;
test == 19999.9995529652 for x64 and test == 20000 for x86

然而:

double test = 1 / 50f *1e6;
test == 19999.9995529652 for both platforms

我知道,用 double 计算 float 并不是一种好的风格,而且我知道,double 和 float 并不精确,但真正让我感到震惊的是 x64 和 x86 仅在之前分配了 float testVar 时表现不同。

有谁知道为什么?

标签: c#floating-pointdouble32bit-64bit

解决方案


我猜编译器将 (testVar * 1e6) 评估为浮点操作,因为至少有一个浮点操作数。然后,除以 1 / float 得到一个保存到变量中的双精度结果。

在第二种情况下,因为没有浮点操作数,所以从头到尾所有内容都被评估为双精度。因此在 x86 的第一种情况下精度损失。


推荐阅读