当将一个具有整数值的double转换为整数时,是否保证它会正确地执行?

当一个双精度数具有“精确的”整数值时,如下所示:

double x = 1.0;
double y = 123123;
double z = -4.000000;

是否保证它在通过(int)x、(int)y、(int)z强制转换为整数类型时正确四舍五入为1、123123和-4?(而不是因为浮点数的奇怪性而截断为0、123122或-5)。我之所以这么问,是因为根据此页面(关于fp在默认情况下仅具有双倍精度的数字类型的语言lua)所说,使用双精度数进行整数运算符合IEEE 754标准,但我不确定在调用具有整数类型参数的C函数时,是否需要手动四舍五入双精度数,或者当双精度数具有精确的整数值时是否已经处理好了。

点赞
用户1169655
用户1169655

是的,它会保留您在代码中输入的准确值。有时在计算中,例如会得出 0.99999999999,但这是由于使用双精度计算而产生的误差,而不是其存储容量的问题。

2012-06-07 20:48:44
用户198536
用户198536

如果它确实是一个整数,那么它将能够正确地运算,在某些情况下你可以确信它是一个整数。但如果该值是以前浮点计算的结果,你可能很难确定它是否是真正的整数。

为什么不用 floor() 函数显式计算该值,如 long value = floor(x + 0.5)。或者,更好的方法是使用 modf() 函数来检查是否为整数值。

2012-06-07 20:54:13
用户1386054
用户1386054

是的, 如果 整数值符合 int 类型的范围。

double 类型可以表示超出 int 类型范围的整数值。例如,如果你的 int 类型只有 16 位,那么 123123.0 无法转换为 int 类型。

同时也不能保证 double 类型可以表示特定类型的所有值。IEEE 754 标准使用类似于 52 或 53 位的尾数。如果你的 long 类型有 64 位,那么将一个非常大的 long 转换为 double 再转回来可能不会得到相同的值。

2012-06-07 22:40:08
用户298225
用户298225

正如丹尼尔·菲舍尔所述,如果你要转换的双精度浮点数的整数部分的值(在你的情况下,指整个双精度浮点数)可以被目标类型表示,那么结果就是准确的。如果该值超出目标类型的范围,则行为未定义。 “未定义”意味着标准允许任何行为:你可能会得到最接近的可表示数字,你可能会得到零,你可能会得到异常,或是计算机可能会爆炸。 (注意:尽管C标准允许你的计算机爆炸,甚至摧毁宇宙,但制造商的规范很可能对行为有更严格的限制)。

2012-06-07 23:41:43