c - 这个 fabs() 的实现是如何工作的?

标签 c floating-point

here 上求 float 绝对值的算法. 这是如何工作的?

//find absolute value
double x;
*(((int *) &x) + 1) &= 0x7fffffff;

我不明白为什么需要偏移 1。它说:

the IA32 64-bit sign bit is 0x80000000 at an int address offset of +1.

有人可以分解并解释一下吗?

最佳答案

该代码在技术上是无效的 C,因为它违反了严格的别名规则。但是,如果您告诉您的编译器不要滥用别名规则,并且您可以保证 doubleint 像在 x86 上一样在内存中布局:

(int *)&x 是指向x 的指针。加 1 将指针向前移动 4 个字节。取消引用它会为您提供 double 的第 4 到第 7 个字节。您屏蔽了它的高位,因为那是 double 的最后一个字节。

顺便说一句,您可以通过使用 char * 并添加 7 而不是 1 来阻止这成为别名冲突。它仍然非常不可移植。

关于c - 这个 fabs() 的实现是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327573/

相关文章:

c - snprintf 在微 Controller 上打印乱码,但在其他环境中正常

python - 整数的 astype float32 与 float64 错误

c++ - Python 和 float ——只打印整数

python - float 转二进制

javascript - IEEE 754 : Javascript vs C

java - mysql 中的 float 和 double 数据类型不存储我的 java 程序所需的完整数字

检查文件是否存在(由命令行参数给出)

c - 数组问题

c - 无法在Android中使用C计算大bmp文件的大小

c++ - 无法写入串行设备,但可以读取