gpt4 book ai didi

c++ - 为什么 `abs()` 的实现方式不同?

转载 作者:IT老高 更新时间:2023-10-28 13:21:52 33 4
gpt4 key购买 nike

在过去的几周里,我的代码中出现了一个非常令人沮丧的错误。我的代码可以在我的计算机上完全按预期运行,但是一旦我将其移植到 HPC 服务器,它就会产生奇怪的结果。

我把它归结为:在我的计算机 (iMac) 上,函数 abs() 适用于 float ,但在服务器上 abs()将其截断为整数。

例子:

服务器

abs(-1.1341234) = 1

我的电脑

abs(-1.1341234) = 1.1341234

现在我知道我可以通过使用 fabs() 来解决这个问题,这不是问题所在。我查看了两台机器上的 gcc 版本,这是输出:

服务器

g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/apps/software/GCCcore/5.4.0/libexec/gcc/x86_64-unknown-linux-gnu/5.4.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --enable-languages=c,c++,fortran --enable-lto --enable-checking=release --disable-multilib --enable-shared=yes --enable-static=yes --enable-threads=posix --enable-gold=default --enable-plugins --enable-ld --with-plugin-ld=ld.gold --prefix=/apps/software/GCCcore/5.4.0 --with-local-prefix=/apps/software/GCCcore/5.4.0 --enable-bootstrap --with-isl=/dev/shm/GCCcore/5.4.0/dummy-/gcc-5.4.0/stage2_stuff
Thread model: posix
gcc version 5.4.0 (GCC)

我的电脑

g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

所以我的问题是,为什么 abs() 在 gcc 和 clang 之间会产生不同的结果?这个问题真的让我花了 3 周的时间,所以你可以想象我刚才有点咸......

最佳答案

必须使用 std::abs,它具有原始类型的重载。

在一种情况下,您正在使用 C++ 版本,在另一种情况下,您正在使用旧的 C 版本(将其参数转换为整数类型)。

要避免的事情:(1) using namespace std; ( here is why ) 和 (2) 没有适当的 #include 来引入您的功能需要。 不要依赖 C++ 标准库实现为您隐式包含文件。

如果您适本地设置警告级别,一些编译器会警告您“有损”转换。

关于c++ - 为什么 `abs()` 的实现方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55916514/

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