12

当 double 具有“精确”整数值时,如下所示:

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

当通过 (int)x、(int)y、(int)z 转换为整数类型时,是否保证它会正确舍入到 1、123123 和 -4?(并且不截断为浮点怪异的 0、123122 或 -5 b/c)。我根据this page询问b / c (这是关于lua中的fp,一种默认情况下只有双精度数作为其数字类型的语言),讨论了根据IEEE 754如何使用双精度数进行整数运算,但我不是确定,当使用整数类型参数调用 C 函数时,我需要担心手动舍入双精度数,或者当双精度数具有精确的整数值时会处理它。

4

4 回答 4

9

是的,如果整数值适合int.

Adouble可以表示超出您的int类型范围的整数值。例如,如果您的类型只有 16 位,123123.0则无法转换为。intint

也不能保证 adouble可以表示特定类型可以表示的每个值。IEEE 754 使用 52 或 53 位作为尾数。如果您long有 64 位,则将非常大的数据转换longdouble和转换可能不会给出相同的值。

于 2012-06-07T22:40:08.003 回答
4

正如 Daniel Fischer 所说,如果 double 的整数部分的值(在您的情况下是 double 精确)在您转换为的类型中是可表示的,则结果是精确的。如果值超出目标类型的范围,则行为未定义。“未定义”意味着标准允许任何行为:您可能会得到最接近的可表示数字,可能会得到零,可能会出现异常,或者计算机可能会爆炸。(注意:虽然 C 标准允许您的计算机爆炸,甚至破坏宇宙,但制造商的规范可能对行为施加了更严格的限制。)

于 2012-06-07T23:41:43.577 回答
1

如果它真的是真正的整数,它会正确地做到这一点,在某些情况下你可以放心。但是,如果该值是先前浮点计算的结果,您就不容易知道了。

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

于 2012-06-07T20:54:13.720 回答
0

是的,它会保留你给它的确切值,因为你在代码中输入了它。有时在计算中它会产生 0.99999999999 例如,但这是由于计算时的错误,而不是其存储容量

于 2012-06-07T20:48:44.900 回答