IT박스

왜`abs ()`가 다르게 구현됩니까?

itboxs 2020. 12. 5. 09:25
반응형

왜`abs ()`가 다르게 구현됩니까?


지난 몇 주 동안 내 코드에 매우 실망스러운 버그가있었습니다. 내 코드는 내 컴퓨터에서 예상대로 정확하게 작동하지만 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 사이에 다른 결과를 생성합니까? 이 문제는 말 그대로 3 주 정도의 진행 시간이 소요 되었기 때문에 지금은 제가 조금 짜릿하다고 상상하실 수 있습니다.


당신은 해야한다 사용 std::abs원시 유형의 과부하를 가지고있는.

한 경우에는 C ++ 버전으로 넘어 가고 다른 경우에는 이전 C 버전 (매개 변수를 정수 유형으로 변환)으로 넘어갑니다.

피해야 할 사항 : (1) using namespace std;( 이유는 여기에 있습니다 ) 및 (2) #include필요한 기능을 가져 오는 데 적절한 s가 없습니다. 암시 적으로 파일을 포함하기 위해 C ++ 표준 라이브러리 구현에 의존 하지 마십시오 .

일부 컴파일러는 경고 수준을 적절하게 설정하면 "손실"변환에 대해 경고합니다.

참고 URL : https://stackoverflow.com/questions/55916514/why-is-abs-implemented-differently

반응형