// Little endianunion ieee754_float { float f; /* This is the IEEE 754 single-precision format. */ struct { unsigned int mantissa:23; unsigned int exponent:8; unsigned int negative:1; } ieee; /* This format makes it easier to see if a NaN is a signalling NaN. */ struct { unsigned int mantissa:22; unsigned int quiet_nan:1; unsigned int exponent:8; unsigned int negative:1; } ieee_nan;}; union ieee754_float { float f;
/* This is the IEEE 754 single-precision format. */ struct { unsignedint mantissa:23; unsignedint exponent:8; unsignedint negative:1; } ieee;
/* This format makes it easier to see if a NaN is a signalling NaN. */ struct { unsignedint mantissa:22; unsignedint quiet_nan:1; unsignedint exponent:8; unsignedint negative:1; } ieee_nan; };
funcmain() { var a = 0.1var b = 0.2 fmt.Println(0.1+0.2, a+b)}// 0.3 0.30000000000000004 var a = 0.1 var b = 0.2 fmt.Println(0.1+0.2, a+b) } // 0.3 0.30000000000000004
if((float)(x+1.0) == (float)(x)) { x = ? }float)(x+1.0) == (float)(x)) { x = ? }
简单分析, ieee754中float采用23bit表示有效位, 再加省略的1, 共有24bit.
当结果超出24bit时, 小数部分被被丢失:
var a float32 = 1 << 24var b float32 = a+1fmt.Println(math.Float32bits(a)) // 1266679808fmt.Println(math.Float32bits(b)) // 126667980824 var b float32 = a+1