现在,浮点数和 double 数虽然可以近似任何种类的数字(尽管可以说是整数,但浮点数更精确),但它们在内部表示为二进制小数。例如,大约为十分之一
0.00011001100110011... (... only goes to computers precision, not infinity)
现在,任何带有有限位的二进制数字都可以称为数学中的
dyadic fraction
表示形式(与p-adic无关)。这表示您将其表示为分数,分母为2的幂。例如,假设我们的计算机近似为十分之一,即0.00011。其二分之一是3/32
或3/(2^5)
,接近十分之一。现在是我的技术问题。 从浮点数中提取二进分数的最简单方法是什么。 不相关的注释:如果您想知道为什么要这样做,那是因为我在Haskell中创建了一个超现实的数字库。二元分数很容易转换为超现实数,这就是为什么将二进制数轻松转换为二进数很方便的原因(不过,我肯定会对有理数感到麻烦。)
最佳答案
decodeFloat
函数似乎对此有用。从技术上讲,您还应该检查floatRadix
是否为2,但据我所知,在GHC中总是如此。
请注意,因为它不会简化尾数和指数。在这里,如果我评估decodeFloat (1.0 :: Double)
,我得到-52的指数和2 ^ 52的尾数,这不是我期望的。
此外, toRational
似乎会生成二进分数。不过,我不确定情况是否总是如此。