visual-studio - 漂浮在视觉工作室
问题描述
考虑符合 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 个最低有效位进行编码。那我错过了什么?
解决方案
如果你看一下https://www.h-schmidt.net/FloatConverter/IEEE754.html 那么你可以看到 2.36018991E-38 的二进制表示是
00000001 00000000 10000000 00111111 并且该二进制值等于您的结构
推荐阅读
- typescript - React Native SectionList:什么是正确的 TypeScript 类型
- javascript - 如何在不禁用 IE11 上的拼写检查的情况下禁用 textarea 中的自动更正?
- python-3.x - sanic.exceptions.RequestTimeout:Sanic 中的请求超时
- php - 使用传单加载多个 gpx 文件
- c - fork():创建的子进程数
- java - How to externally add a javascript file to a JSP in a maven project?
- angular - Angular 7 - 使用 *ngFor 属性设置变量点击事件
- java - 带有 asm 字节码操纵器的内联方法
- python - 按天计算计数
- php - Laravel Auth:返回 json 而不是重定向