基元浮点和双精度支持小数位数
How many decimal places does the primitive float and double support?
我读到double存储15位数字,float存储7位数字。
我的问题是,这些数字是支持的小数位数还是一个数字中的总位数?
如果您在使用IEEE-754浮点运算的体系结构上(与大多数体系结构一样(,则类型float
对应于单精度,类型double
对应于双精度,如标准中所述。
让我们做一些数字:
单精度:
32位表示数字,其中24位表示尾数。这意味着最低有效位(LSB(相对于MSB具有2^(-24(的相对值;隐藏1";,并且它没有被表示。因此,对于固定指数,最小可表示值是指数的10^(-7.22(倍。这意味着对于基指数表示法(3.141592653589E25(中的表示;7.22〃;十进制数是有效的,这意味着在实践中至少有7个十进制数是正确的。
双精度:
64位表示数字,其中53位用于尾数。根据同样的推理,将2^(-53(表示为10的幂会导致10^(-15.95(
如果你愿意的话,这些是"有效数字"的总数,从左到右计数,无论小数点在哪里。超过这些数字,准确性将无法保持。
您列出的计数是针对基数为10的表示法。
每种类型支持的小数位数都有宏。gcc文档解释了它们是什么以及它们的含义:
FLT_DIG
这是浮点数据类型的精度小数位数。从技术上讲,如果p和b(分别(是表示的精度和基数,那么小数精度q是小数位数的最大值,使得任何以q为基数的10位浮点数都可以四舍五入为以p为基数的b位浮点数,然后再返回,而不改变q的小数位数。
该宏的值应至少为6,以满足ISO C.
DBL_DIG
LDBL_DIG这些类似于FLT_DIG,但分别用于数据类型double和long double。这些宏的值应该是至少10。
在gcc 4.9.2和clang 3.5.0上,这些宏分别产生6和15。
这些数字是支持的小数位数还是一个数字中的总位数?
它们是每个数字中包含的有效数字(尽管您可能不需要所有这些数字,但它们仍然存在(。相同类型的尾数总是包含相同数量的位,因此如果你从十进制数字的角度来看,每个数字必然包含相同数量有效的"数字"。存储的位数不能超过尾数所能容纳的位数。
然而,"支持"的位数要大得多,例如float
通常最多支持38位小数,double
最多支持308位小数,但这些数字中的大多数都是无效(即"未知"(。
尽管从技术上讲,这是错误的,因为float
和double
不像我上面假设的那样具有普遍定义的大小(它们是实现定义的(。此外,存储大小不一定与中间结果的大小相同。
C++标准非常不愿意精确定义任何基本类型,几乎所有内容都留给实现。浮点类型也不例外:
3.9.1/8
有三种浮点类型:浮点、双精度和长双精度。类型double提供的精度至少与float相同,而类型long double至少提供的精度与double相同。float类型的值的集合是double类型的值集合的子集;双精度类型的值集合是长双精度类型值集合的子集。浮点类型的值表示是由实现定义的。
当然,所有这些在实践中并没有特别的帮助。
在实践中,浮点(通常(符合IEEE 754,float
具有32位的宽度,double
具有64位的宽度(存储在存储器中,寄存器在一些著名的主流架构上具有更高的精度(。
这分别相当于24位和53位的matissa,或7和15位全小数。
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- C++将浮点指针值舍入为小数位数
- 从给定的 I 和 D 序列中形成最小数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 计算 PI 最多 42 位小数
- 为什么我必须添加一个小数才能在C++中正确计算此数学
- 返回浮点数的小数位数
- 哪个C++规范开始支持 std::vector
- 基元浮点和双精度支持小数位数
- 字符串到浮点的转换,同时支持小数点和小数逗号