能否12.1准确表示为浮点数?
-
19-09-2019 - |
题
这是在参考注释在此问题:
这个代码在Java中产生12.100000000000001并且这被使用能够呈现12.1准确的64位双精度。 - Pyrolistical
这是真的吗?我认为,由于浮点数被表示为两个大国的总和,你不能代表12.1准确,不管你有多少位有。然而,当我实现两者的算法和印有调用它们的结果(12.1,3)与许多显著数字,我分别得到,为他的和矿:
12.10000000000000000000000000000000000000000000000000000000000000000000000000 12.10000000000000100000000000000000000000000000000000000000000000000000000000
我印刷此使用String.format("%76f")
。我知道这是多个零比必要的,但我没有看到任何舍入的12.1。
解决方案
没有。正如其他人在followups他的评论指出,没有总和(有限数量)的两个大国能永远加起来正好12.1。就像你不能代表1/3恰好基地十个,无论你小数点后多少位使用。
其他提示
在二进制,12.1是:
1100.000110011001100110011...
由于这不终止,它不能被精确地在双,或任何其他有限宽度二进制浮点类型的53个有效数位表示。
尝试来表达二进制0.1:结果 0.5是太大点击 0.25太大点击 0.125太大点击 0.0625配合,并留下0.0375结果余数 0.03125配合,并留下的0.00625结果余数 0.015625太大点击 0.0078125太大点击 0.00390625配合,并留下的0.00234375结果余数 0.001953125配合,并且留下的余数0.000390625
这将不断重复下去,产生的0.00011001100基部2值...
没有,它不能被精确地在双表达。如果Java支持BCD,或定点小数,将工作完全一样。
不以二进制,没有。如果你让我天马行空,你可以在“浮点二进制编码的十进制”(其中,向我所知,从未实现):
12.1 = 0000 . 0001 0010 0001 * (10^2)
在二元所有非零值的形式1.xyz * m
的,和IEEE形式利用了这一点,省略领先1.我不知道相当于是做什么用FP-BCD,所以我走了值的形式0.xyz * m
代替。
我建议您阅读什么每台计算机科学家应该知道关于浮点浮点运算的。然后你就会知道。 :)
一个办法看到双是相当准确的将其转换为BigDecimal的。
// prints 12.0999999999999996447286321199499070644378662109375
System.out.println(new BigDecimal(12.1));
是,可以精确地表示12.1浮点。 你只是需要一个十进制浮点表示,而不是二进制一。
使用的BigDecimal类型,你会完全代表它!
没有,十进制数12.1
不能被表示为一个有限的(终止)二进制浮点数。
记住12.1
是有理数121/10
。请注意,此级分在最低术语(不能通过除去分子的分母的共同fators被减小)。
假设(以达到一个矛盾),该121/10
可以也写作n / (2**k)
其中n
和k
一些正整数,且2**k
表示的两个k
th功率。我们将有一个反例来唯一分解。特别地
10 * n == 2**k * 121
,其中左手侧是由5整除其中右手侧是没有的。
这可以用一种选择是,不存储V = 0.1,而是商店V10 = 1。在需要时(该司将在结果创建截断误差,但v仍将OK)
只需除以10在这种情况下,你基本上是做一个固定的点劈,但保持在浮数。 但它通常不值得这样做,除非你真的不得不这样做。