gpt4 book ai didi

c - 直接将 double 结果分配给 int 时的精度损失/舍入差异

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:01 24 4
gpt4 key购买 nike

在这种情况下,从 double 转换为 int 是否按预期执行是有原因的:

double value = 45.33;
double multResult = (double) value*100.0; // assign to double
int convert = multResult; // assign to int
printf("convert = %d\n", convert); // prints 4533 as expected

但在这种情况下不是:

double value = 45.33;
int multResultInt = (double) value*100.0; // assign directly to int
printf("multResultInt = %d\n", multResultInt); // prints 4532??

在我看来应该没有区别。在第二种情况下,结果在转换为 int 之前仍然首先存储为 double,除非我不理解强制转换和硬赋值之间的一些区别。

最佳答案

两者之间确实没有区别,但是当涉及到浮点计算时,编译器习惯于采取一些自由。例如,编译器可以自由地为计算的中间结果使用更高精度,但更高仍然意味着不同,因此结果可能会有所不同。

一些编译器提供开关以始终放弃额外的精度并将所有中间结果转换为规定的 float (比如 64 位 double )。但是,这会使代码变慢。

具体来说,数字 45.33 不能用浮点值精确表示(用二进制表示时它是一个周期数,需要无限位数)。当乘以 100 时,这个值可能不是整数,而是非常接近的值(刚好低于或高于)。

int 转换或转换使用截断和非常接近 4533 的东西执行,但下面将变为 4532,而上面将变为 4533;即使差异非常小,比如 1E-300

为避免出现问题,请务必考虑数字准确性问题。如果您进行的计算依赖于 float 的精确值,那么您就使用了错误的工具。

关于c - 直接将 double 结果分配给 int 时的精度损失/舍入差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com