double - 精度和的含义。双类型范围

标签 double ieee-754 floating

首先,请允许我承认我是一名经验丰富的程序员,拥有超过 10 年的编程经验。然而,我在这里问的问题是自从大约十年前我第一次拿起一本关于 C 的书以来一直困扰着我的问题。

下面是一本关于Python的书的摘录,解释了Python的 float 类型。

Floating-point numbers are represented using the native double-precision (64-bit) representation of floating-point numbers on the machine. Normally this is IEEE 754, which provides approximately 17 digits of precision and an exponent in the range of –308 to 308.This is the same as the double type in C.

我一直不明白这句话的意思

" ... which provides approximately 17 digits of precision and an exponent in the range of –308 to 308 ... "

我的直觉误入歧途,因为我可以理解精度的含义,但范围怎么可能与此不同。我的意思是,如果一个 float 可以表示最多 17 位的值(即最大 1,000,000,000,000,000,00 - 1),那么指数怎么可能是 +308。如果指数为 10,这不是会产生 308 位数字;如果指数为 2,这会不会产生大约 100 位数字。

我希望我能够表达我的困惑。

问候 瓦伊德,阿布舍克

最佳答案

假设我们用两位数的精度写出 1500。这意味着我们足够精确来区分 1500、1600 和 1400,但不够精确,无法区分 1500、1510 或 1490。区分这些数字需要三位数的精度。

即使我写了四位数字,浮点表示也不一定包含所有这些数字。 1500 是 1.5 * 10^3。在十进制浮点表示中,精度为两位数,只存储数字和指数的前两位,我将其写为(1.5, 3)。

为什么“真实”数字和占位符零之间存在区别?因为它告诉我们可以多么精确地表示数字,即由于近似而损失了多少部分值。我们可以区分 1500 = (1.5, 3) 和 1500+100 = (1.6, 3)。但如果我们增加指数,我们就无法区分 15000 = (1.5, 4) 和 15000+100 = (1.51, 4)。最好的情况是,我们可以将数字近似到 +/- 10% 的范围内,并具有两位小数的精度。无论指数允许多大或多小都是如此。

关于double - 精度和的含义。双类型范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10891228/

相关文章:

c++ - 在 C++ 中检查 double 是否为 2 的幂而无需位操作的代码

c# - 浮点加法 : loss-of-precision issues

c++ - 如何将 IEEE-754 格式整数输出为 float

java - 这些说法有什么区别?

swift - 使用 Swift 查找 Double 有多少个数字

c++ - 为什么我的数字在我的猜数字游戏中计算不正确?

racket - Racket 中的融合乘加

css - 在 float 的右父元素中向左浮动所有元素

javascript - 用javascript将数组中的每个值相乘

java - 将 double 格式设置为五位小数