当我使用Clang ++和G ++编译以下C ++代码时
void ScaleFactor(float32_t scale, int32_t &factor) {
factor = floor(log2(abs(scale))+1)
cout << factor << endl;
}
其中scale
的值等于0.234375,并且factor
通过引用传递给另一个函数中的整数变量,在使用GDB进行调试时,我得到了factor
的以下不同输出
(int32_t &) @0x7fffffffdaa0: -2147483648 (Clang++)
(int32_t &) @0x7fffffffda9c: -2 (G++)
但是,在将abs()
替换为fabs()
时,每个输出都将与所需的输出匹配
(int32_t &) @0x7fffffffdb90: -2 (Clang++)
(int32_t &) @0x7fffffffdddc: -2 (G++)
这种差异的原因可能是什么?
答案 0 :(得分:1)
请参阅本帖子的answer。 abs
通常用于整数,fabs
用于浮点类型。但是,看来abs
的G ++实现也将处理浮点数。
答案 1 :(得分:1)
此代码产生相同的结果吗?对我来说,似乎不是:https://godbolt.org/z/Wj9v6j
#include <iostream>
#include <cmath>
using namespace std;
using float32_t = float;
void ScaleFactor(float32_t scale, int32_t &factor) {
factor = floor(log2(abs(/*(int)*/scale))+1);
cout << factor << endl;
}
int main() {
int32_t result;
ScaleFactor(0.234375f, result);
return 0;
}
如果没有,您确定这里没有其他问题吗?也许您包括数学函数的C版本,而使用clang进行构建时,abs和fabs有所不同?
您得到的怪异结果恰好是将float传递给abs时将float转换为int所得到的结果,正是您使用C版本的abs所期望的结果。