c++ - 为什么 c/c++ 浮点类型的命名如此奇怪?

标签 c++ c floating-point history ieee-754

C++ 提供三种浮点类型:float、double 和 long double。我很少在我的代码中使用 float ,但是当我这样做时,我总是被诸如

之类的无害行上的警告所吸引
float PiForSquares = 4.0;

问题是文字 4.0 是 double ,而不是 float - 这很烦人。

对于整数类型,我们有 short int、int 和 long int,这很简单。为什么 C 没有短 float 、 float 和长 float ? “double”到底是从哪里来的?

编辑: float 类型之间的关系似乎类似于整数。 double 必须至少与 float 一样大,long double 至少与 double 一样大。没有其他精度/范围保证。

最佳答案

术语“单精度”和“ double ”起源于 FORTRAN,并且在 C 发明时已经广泛使用。在 1970 年代早期的机器上,单精度效率明显更高,并且与今天一样,使用的内存是 double 的一半。因此它是 float 的一个合理的默认值

long double在很久以后才添加,当时 IEEE 标准允许 Intel 80287 浮点芯片使用 80 位 float 而不是经典的 64 位 double 。

提问者关于保证的说法不正确;今天几乎所有语言都保证以单精度(32 位)和 double (64 位)实现 IEEE 754 二进制 float 。有些还提供扩展精度(80 位),在C 中显示为long double。由威廉·卡汉 (William Kahan) 带头的 IEEE 浮点标准是良好工程对权宜之计的胜利:在当时的机器上,它看起来非常昂贵,但在今天的机器上,它非常便宜,而且 IEEE 浮点的可移植性和可预测性- 点数每年必须节省数十亿美元。

关于c++ - 为什么 c/c++ 浮点类型的命名如此奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/399114/

相关文章:

c++ - 如何将字符范围从字符数组复制到 vector ?

c++ - 在 C++ Actors Framework 中的类型化 actor 之间转发消息的最佳实践?

c - 如何在屏幕上显示搜索到的字符串?

将函数式语言编译为 C

c# - 为什么 C# 允许从 Long 到 Float 的*隐式*转换,而这可能会丢失精度?

c - 从字符数组进行浮点检查以进行限制,字符检查正面和背面

c++ - 为什么 OpenMP 不允许使用 != 运算符?

c++ - 如何在cuda中获取cutil64D.lib文件

c - 只是想确保我理解外部变量是什么

json - 将数字从 float64 转换为 Int64 不正确