将原始二进制转换为小值的浮点打印 0
Converting raw binary to float printing 0 for small values
我正在尝试读取 2 个 32 位值(假设它们是 ieee 745 单精度浮点值)并使用以下代码段比较它们以检查它们是否相等,
#include <stdio.h>
#include <stdint.h>
void main(){
int a;
int b;
//a = 0x3f99999a ;
//b = 0x3fa66666 ;
a = 0xfa98 ;
b = 0x65cc ;
printf("Comparison is %d\n",((*(float*)&(a))==(*(float*)&(b))));
printf("Numbers are a= %f and b = %f \n",(*(float*)&(a)),(*(float*)&(b)));
}
以下代码段 运行 在 2 个不同的平台上使用,两者都给出了不同的结果(一个正确,另一个错误)。没有编译器优化。
平台 A - Xeon 服务器(Intel (R) Xeon (R) CPU E5),带有 fedora release 20 和 gcc 编译器版本(4.8.3(Red Hat 4.8.3-7))
a = 0xfa98 和 b = 0x65cc 的输出是:
Comparison is 1 // This is clearly wrong as both numbers are unequal
Numbers are a= 0 and b = 0 // Casting it to float is causing them to 0 ??
a = 0x3f99999a 和 b = 0x3fa66666 的输出是:
Comparison is 0 // This is correct
Numbers are a= 1.2 and b = 1.3 // True decimal values for given 745 representation
平台 B - Intel i7 (Intel (R) i7-3770) ubuntu 14.04 和 gcc 编译器版本 ( 4.8.2 ( Ubuntu 4.8.2-19 ubuntu 1 ))
a = 0xfa98 和 b = 0x65cc 的输出是:
Comparison is 0 // This is correct !!
Numbers are a= 0 and b = 0 // Still 0 because numbers are subnormal
a = 0x3f99999a 和 b = 0x3fa66666 的输出是:
Comparison is 0 // This is correct
Numbers are a= 1.2 and b = 1.3 // True decimal values for given 745 representation
所以我的问题是为什么平台 A 会产生错误的浮动比较结果。第一组值低于正规值,在十进制表示中非常小,但绝对不相等。由于代码适用于第二组值(大值)。有人可以向我解释一下吗?为什么平台 A 没有显示平台 B 显示的值不同?
问题出在 mxcsr 寄存器的 DAZ 位上。一台机器 A 设置了它,因此它将非正规化视为 0 。在机器 2 上,DAZ 被重置,因此它对其进行归一化并将非正规化视为不同的值,这导致比较结果不相等。但我真的很感谢所有帮助的人:)!没有你的帮助就无法调试它。
我正在尝试读取 2 个 32 位值(假设它们是 ieee 745 单精度浮点值)并使用以下代码段比较它们以检查它们是否相等,
#include <stdio.h>
#include <stdint.h>
void main(){
int a;
int b;
//a = 0x3f99999a ;
//b = 0x3fa66666 ;
a = 0xfa98 ;
b = 0x65cc ;
printf("Comparison is %d\n",((*(float*)&(a))==(*(float*)&(b))));
printf("Numbers are a= %f and b = %f \n",(*(float*)&(a)),(*(float*)&(b)));
}
以下代码段 运行 在 2 个不同的平台上使用,两者都给出了不同的结果(一个正确,另一个错误)。没有编译器优化。
平台 A - Xeon 服务器(Intel (R) Xeon (R) CPU E5),带有 fedora release 20 和 gcc 编译器版本(4.8.3(Red Hat 4.8.3-7))
a = 0xfa98 和 b = 0x65cc 的输出是:
Comparison is 1 // This is clearly wrong as both numbers are unequal
Numbers are a= 0 and b = 0 // Casting it to float is causing them to 0 ??
a = 0x3f99999a 和 b = 0x3fa66666 的输出是:
Comparison is 0 // This is correct
Numbers are a= 1.2 and b = 1.3 // True decimal values for given 745 representation
平台 B - Intel i7 (Intel (R) i7-3770) ubuntu 14.04 和 gcc 编译器版本 ( 4.8.2 ( Ubuntu 4.8.2-19 ubuntu 1 ))
a = 0xfa98 和 b = 0x65cc 的输出是:
Comparison is 0 // This is correct !!
Numbers are a= 0 and b = 0 // Still 0 because numbers are subnormal
a = 0x3f99999a 和 b = 0x3fa66666 的输出是:
Comparison is 0 // This is correct
Numbers are a= 1.2 and b = 1.3 // True decimal values for given 745 representation
所以我的问题是为什么平台 A 会产生错误的浮动比较结果。第一组值低于正规值,在十进制表示中非常小,但绝对不相等。由于代码适用于第二组值(大值)。有人可以向我解释一下吗?为什么平台 A 没有显示平台 B 显示的值不同?
问题出在 mxcsr 寄存器的 DAZ 位上。一台机器 A 设置了它,因此它将非正规化视为 0 。在机器 2 上,DAZ 被重置,因此它对其进行归一化并将非正规化视为不同的值,这导致比较结果不相等。但我真的很感谢所有帮助的人:)!没有你的帮助就无法调试它。