考虑符合IEEE 754标准的单精度浮点数系统。在Visual Studio中,FP开关设置为“严格”。
struct FP {
unsigned char a : 8;
unsigned char b : 8;
unsigned char c : 8;
unsigned char d : 8;
}*fp;
fp->a = 63;
fp->b = 128;
fp->c = 0;
fp->d = 1;
std::cout << "raw float = " << *reinterpret_cast<float*>(fp) << "\n";
根据标准,该数学值为1.00000011920928955078125。
Visual Studio打印的内容是原始浮标= 2.36018991e-38。为什么?
假设符号位为0。指数部分为0111 1111。
在其余23位中,假设01和10是最低有效位,这意味着数学值分别为number1 = 1.00000011920928955078125和number2 = 1.0000002384185791015625。中间值为number3 = 1.000000178813934326171875。因此,应通过对至少两个有效位进行01编码来捕获number1和number3之间的所有值,并且应通过对10个最低有效位进行编码来捕获number3与number2之间的值。但是Visual Studio捕获了1.0000001788139343(实际上落在number1和number3之间)和更大的值(使用10个最低有效位进行编码)。那我在想什么呢?
答案 0 :(得分:2)
如果您看看https://www.h-schmidt.net/FloatConverter/IEEE754.html 那么您可以看到2.36018991E-38的二进制表示形式是
00000001 00000000 10000000 00111111 该二进制值等于您的结构