我可能完全错了,我对此一无所知,但我对编程语言中的十进制数字数据有疑问。我知道浮点数并不完全精确,因为它们以二进制形式存储有权或其他东西,但我总是想知道为什么十进制数数据类型不只是存储一个数字就好像没有小数一样,所以做计算就像如果没有小数,则在之后添加。就像在这种情况下:
2.159 * 3.507 --> 2159 * 3507 = 7571613
^^^ ^^^
123 456
6 decimals in total... 7571613 -> 7.571613
^^^^^^
654321
所以2.159 * 3.507 = 7.571613
为什么它不能像那样工作?
答案 0 :(得分:9)
这正是他们所做的。浮点数以指数形式存储。我们假设我们正在使用基于小数的计算机,因此我不必将所有这些数字更改为二进制。
您正在乘以2.159 * 3.507
,但实际上2.159
存储为2159 * 10^-3
,3.507
存储为3507 * 10^-3
。由于我们正在使用基于小数的系统,因此假设为10
,因此我们只需将-3
存储在10
之内,如下所示:2159,-3
或3507,-3
。 -3
是“浮点”的位置:随着点向左移动,浮点数减少(.3507
存储为3507,-4
),随着点向右移动,浮点数增加(35.07
存储为3507,-2
)。
当你将两者相乘时,十进制数(或二进制计算机上的二进制数)是唯一成倍增加的数字。 浮点数被添加!所以在幕后发生的事情是:
2.159 * 3.507
2159,-3 * 3507,-3
2159 * 3507,-3 + -3
7571613,-6
7571613,-6
只是7571613 * 10^-6
(请记住我们可以假设10
,因为我们正在使用十进制计算机),这与7.571613
相同。
当然,浮点不一定是-3
,它可以是适合存储的任何东西:
21590 * .3507
2159,1 * 3507,-4
2159 * 3507,1 + -4
7571613,-3
7571.613
当然,大多数计算机都不会以十进制形式存储内容,因此实际数字将全部为二进制,浮点数将类似于2^-9 -> -9
而不是10^-3 -> -3
。但是你明白了。
答案 1 :(得分:3)
这称为“fixed-point arithmetic”人们一直这样做。
答案 2 :(得分:1)
有很多定点运算的实现。但是,我们经常使用定点存储非常快速地用完小数位。它是货币交易的理想选择,我们知道我们不会存储/关心任何无理数。
此外,对于很多其他事情,定点算术不值得开销。浮点速度要快得多。
要阅读的内容: