gpt4 book ai didi

c++ - floor 在不同的平台上给出不同的结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:17:35 24 4
gpt4 key购买 nike

我正在尝试用 C++ 实现一个系统,我可以在其中判断数字是否为整数(小数点后的所有内容均为零)。为此,我使用了 if (sqrt(answer/2) == floor(sqrt(answer/2)))

我的问题是我在不同的系统、macOS 和 Linux Fedora 27 上得到不同的结果。在我的 Linux 机器上我运行的是 GCC 7.3.1 20180130,而 macOS 机器在我的学校,我无法检查它们现在。不过,我知道 macOS 使用的是可笑的旧版本开源工具。

我的全部代码是:

#include <iostream>
#include <cmath>
using namespace std;
int main() {
double answer = 1.0;
loop:
// uncomment line under for verbose
cout << "testing " << answer << endl;
if (sqrt(answer / 2) != floor(sqrt(answer / 2))) {
answer++;
goto loop;
} else { if (cbrt(answer / 3) == floor(cbrt(answer / 3))) {
cout << "ANSWER IS " << answer << endl;
return 0;
} else {
answer++;
goto loop;
}
}
return 0;
}

我列出了一些 I/O 对:

answer648.0cbrt(answer/3.0)的输出为6

answer648.0floor(cbrt(answer/3.0)) 的输出为 6

(cbrt(answer/3.0) == floor(cbrt(answer/3.0)))为假

(cbrt(648.0/3.0) == floor(cbrt(648.0/3.0))) 为真

我知道这可能是一个 float 问题,我不知道是否有更好的方法来检查一个数字是否是整数。

如果我需要澄清任何事情,请告诉我。

最佳答案

sqrt() 和 cbrt() 不必参与其中。按照“整数”的正常数学定义,您只需要知道小数部分是否为零即可。应该足以检查:

如果(地板(答案)==答案)...

这里出现不匹配的原因可能与 sqrt() 或 cbrt() 无关。它更多的是除以 3.0。在基数 10 中,当你除以 3 时,你会得到一个循环小数,例如:

1.0/3.0 = 0.3333333...

float ——即使是 double ——也只能保持这么高的精度。即使将上面的值乘以 3.0,它也可能会稍微偏离:

(1.0/3.0) * 3.0 = 0.9999999...

有些计算机在内部将“除以 3.0”实现为“乘以三分之一”。它们可以在最后一位相差一位,但这足以将 1.0 更改为 0.9999...当您对它们进行 floor() 时,这些数字将产生不同的结果。

sqrt() 和 cbrt() 函数在最后一位数字问题上可能有相似的差 1。

避免这种情况的一种方法是说,“好吧,我只想要一些接近的整数。”然后您只需决定多近就足够了,然后对此进行测试:

if ( abs( round( answer ) - answer ) < .0001 ) ...

机器算法的这些细节会变得非常复杂,而且很快。不同的机器在不同的情况下最后一位可能有不同的答案。除非并且直到您准备好处理复杂的事情,否则类似上面这行的内容可能是最好的解决方案。

关于c++ - floor 在不同的平台上给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48696755/

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