首页 > 解决方案 > 漂浮在视觉工作室

问题描述

考虑符合 IEEE 754 标准的单精度浮点数系统。在 Visual Studio 中,FP 开关设置为 Strict。

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。因此,number1 和 number3 之间的所有值都应通过使用 01 至少两个有效位进行编码来捕获,而 number3 和 number2 之间的值应通过使用 10 最低有效位进行编码来捕获。但是 Visual Studio 捕获 1.0000001788139343(这实际上介于 number1 和 number3 之间)和更大的值以 10 个最低有效位进行编码。那我错过了什么?

标签: visual-studiofloating-pointieee-754

解决方案


如果你看一下https://www.h-schmidt.net/FloatConverter/IEEE754.html 那么你可以看到 2.36018991E-38 的二进制表示是

00000001 00000000 10000000 00111111 并且该二进制值等于您的结构

在此处输入图像描述


推荐阅读