【发布时间】:2017-07-14 10:14:46
【问题描述】:
我正在尝试将一段特定的代码从 solaris 移植到 Linux。在这个过程中我发现linux上的精度是不同的,它是扩展精度,我们需要明确地将它设置为双精度。为此找到了fpu_control.h库,函数FPU_GETCW和FPU_SETCW函数。但即使在那之后,精度也没有正确设置。 代码sn-p
long double power = 1.0;
#ifdef __linux
fpu_control_t mask;
_FPU_GETCW(mask);
mask &= ~(_FPU_EXTENDED & _FPU_SINGLE);
mask |= _FPU_DOUBLE;
_FPU_SETCW(mask);
power *= 0.1;
#endif
当我打印电源时,值是 功率 = 0.1000000000000000055511151231257827
但是我期望 power 的值是 0.1 我在编译时也使用了 -DDouble。有人可以指出我出了什么问题。
【问题讨论】:
-
我不明白这个。如果你希望
power是一个双精度变量,为什么要声明它为long double?我假设您知道,无论精度如何,0.1 都不能精确地表示为浮点值。 -
你是对的,但是这种乘法发生在循环内,基于某些条件。 IE。有时我们最终可能会进行 5 次或 3 次乘法运算。所以在每次乘法之后,值都会改变,即。 .1,.01.001, .0001 等基于外部因素。因此代码
-
@girishs 你得到的数字是最接近十进制 0.1 的双精度二进制浮点数。有什么问题?尽可能准确。
-
@art 但是当我打印该值时,它也是一个巨大的数字,如果我稍后使用这个数字进行一些算术运算,我会得到一个不同的数字,对吗?我的期望是我获得与在 Solaris 上获得相同的价值。 (对不起,我可能在这里遗漏了一些东西)
-
@girishs 您应该将有问题的代码显示为 MCVE 以及输入、预期输出和实际输出。
标签: c linux fpu decimal-precision