gpt4 book ai didi

c++ - 公式一样,为什么输出不一样?

转载 作者:行者123 更新时间:2023-12-01 20:20:08 25 4
gpt4 key购买 nike

int y = 89;
int foo = (y / 10.0 - y / 10) * 10;
int bar = (89 / 10.0 - 89 / 10) * 10;
cout << foo << ' ' << bar << '\n';

上面的代码是为了获取一个整数y的最后一位,奇怪的是foo是8而bar是9,为什么会出现这种情况呢?两个版本的表达式有什么区别?

最佳答案

C++ 标准允许实现以比标称格式要求更高的精度来计算浮点表达式。例如,float表达式可以被计算为 double或更多,以及double表达式可以被计算为 long double 。这种额外的精度可能会导致计算结果出现差异,尤其是在使用不连续函数(例如转换为 int )的情况下。

例如,给定 y = 89 , y / 10.0 - y / 10在实数算术中是 0.9,但在 double 中却是 0.9000000000000003552713678800500929355621337890625 (IEEE-754 二进制 64)算术和 long double 中的 0.89999999999999999965305530480463858111761510372161865234375 (Intel的80位格式)算术,然后乘以10并转换为int分别产生 9 或 8。

禁用优化后,编译器可能会使用 y 计算表达式在运行时和表达式 89在编译期间,它可能对它们使用不同的精度。通过优化,编译器可能会识别 y实际上是一个常数89在第一个表达式中并在编译期间计算两个表达式,对两个表达式使用相同的方法。

C++ 标准要求强制转换和赋值操作转换为名义类型,因此检查是否发生这种情况的一项测试是插入强制转换:

int foo = (double) ((double) (y / 10.0) - y / 10) * 10;
int bar = (double) ((double) (89 / 10.0) - 89 / 10) * 10;

如果这导致 foobar相同,支持假设。您的编译器可能有开关来控制浮点表达式的计算方式。

另一个测试是包含 <cfloat>并打印 FLT_EVAL_METHOD 的值。如果它是 0,则实现声称以标称类型计算浮点运算,并且这种行为不应发生。如果是 1 或 2,则该实现声称使用 doublelong double评估double表达式,并且这种行为不应该再次发生,因为两个表达式将以相同的方式计算。如果为 -1,则实现不会做出这些声明,并且可能会发生该行为。

要获取非负整数的最后一位,请使用 y % 10 .

关于c++ - 公式一样,为什么输出不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442634/

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