过去几周,我的代码中出现了一个令人沮丧的错误。我的代码可以在计算机上完全按预期工作,但是一旦将其移植到HPC服务器上,就会产生奇怪的结果。
我将其归结为:在我的计算机(iMac)上,功能abs()
使用浮点数,但是在服务器abs()
上将其截断为整数。
示例:
服务器
abs(-1.1341234) = 1
我的Mac
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)
我的Mac
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之间产生不同的结果?从字面上看,这个问题使我花了三个星期的时间,所以可以想象一下我刚才有点咸...
答案 0 :(得分:88)
您必须使用std::abs
,它对原始类型有重载。
在一种情况下,您会陷入C ++版本,而在另一种情况下,您会陷入旧的C版本(将其参数转换为整数类型)。
应避免的事情:(1)using namespace std;
(here is why)和(2)没有适当的#include
来引入所需的功能。 不要依靠C ++标准库实现为您隐式包含文件。
如果适当地设置警告级别,某些编译器会警告您“有损”转换。