我想dc
用十六进制点处理一些基数为 16 的数字,但我遇到了精度问题。例如,下面,我乘F423F.FD
用100
,无论是十六进制。预期的答案是F423FFD
,而不是给出F423FFA.E1
,接近但即使在四舍五入后也不够准确。
$ dc
16 d i o F423F.FD 100 * p
F423FFA.E1
Run Code Online (Sandbox Code Playgroud)
我读到这dc
是一个无限精度的计算器,无论如何这都不是一个很大的数字。有什么我做错了吗?
感谢您的回答。考虑到 的问题dc
,我硬着头皮写了自己的解析器来解析其他基数的实数。如果有人对代码感兴趣,我可以在这里发布。
表示为十进制(dc
用于转换),这对应于999999.98(四舍五入)×256,即255999994.88,即十六进制的F423FFA.E1。
所以差异来自于dc
的舍入行为:不是计算 256 × (999999 + 253 ÷ 256),这将给出 255999997,而是向下舍入 253 ÷ 256 并将结果相乘。
dc
是一个任意精度计算器,这意味着它可以计算到您想要的任何精度,但您必须告诉它那是什么。默认情况下,其精度为 0,这意味着除法仅生成整数值,乘法使用输入中的位数。要设置精度,请使用k
(并记住精度始终以十进制数字表示,无论输入或输出基数如何):
10 k
16 d i o
F423FFD 100 / p
F423F.FD0000000
100 * p
F423FFD.000000000
Run Code Online (Sandbox Code Playgroud)
(8 位数的精度就足够了,因为这是您需要用十进制表示 1 ÷ 256 的精度。)
请注意,仅打印原始数字表明它已四舍五入:
$ dc <<<'16 d i o F423F.FD p'
F423F.FA
Run Code Online (Sandbox Code Playgroud)
您可以通过添加大量尾随零以获得更高的精度来解决它:
$ dc <<<'16 d i o F423F.FD000000 100 * p'
F423FFD.0000000
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1161 次 |
最近记录: |