gpt4 book ai didi

c++ - 在 C++ 中转换大整数 <-> double

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:25 25 4
gpt4 key购买 nike

为了好玩,我正在用 C++ 编写自己的长算术库,它已经完成了,我什至用那个库实现了几个 Cryptogrphic 算法,但仍然缺少一件重要的事情:我想转换 double (和 float /长 double )到我的号码,反之亦然。我的数字表示为一个可变大小的无符号长整型数组加上一个符号位。

我试图用谷歌找到答案,但问题是人们很少自己实现这些东西,所以我只找到关于如何使用 Java BigInteger 等的东西。

从概念上讲,这相当简单:我取尾数,将其移动指数指定的位数并设置符号。在另一个方向上,我截断它以使其适合尾数并根据我的 log2 函数设置指数。

但我很难弄清楚细节,我可以尝试一些位模式并将其转换为 double ,但我没有找到实现该目标的优雅方法,或者我可以“计算”它从 2 开始,求幂,乘法等,但这似乎不是很有效。

我希望有一个不使用任何库调用的解决方案,因为我试图避免为我的项目使用库,否则我可以只使用 gmp,此外,我经常在其他几个场合有两个解决方案,一个使用内联一种高效且更独立于平台的汇编程序,因此任何一个答案对我都有用。

编辑:我将 uint64_t 用于我的部分,但我希望能够根据机器更改它,但我愿意使用一些 #ifdef 来实现一些不同的实现。

最佳答案

我将在这里做出不可移植的假设:即 unsigned long longdouble 更准确. (在我所知道的所有现代桌面系统上都是如此。)

首先,将最高有效整数转换为 unsigned long long .然后将其转换为双 S .让M是比第一步中使用的整数少的整数个数。相乘 S通过 (1ull << (sizeof(unsigned)*CHAR_BIT*M) . (如果移动超过 63 位,则必须将它们拆分为单独的移位并进行一些算术运算)最后,如果原始数字为负数,则将此结果乘以 -1。

这四舍五入了很多,但即使进行了这种四舍五入,由于上述假设,没有数字丢失,无论如何转换为 double 都不会丢失。我认为这与 Mark Ransom 所说的过程类似,但我不确定。

要将 double 转换为双整数,首先将尾数分隔成 double M和指数到 int E , 使用 frexp .相乘M通过 UNSIGNED_MAX ,并将结果存储在 unsigned R 中.如果std::numeric_limits<double>::radix()是2(我不知道它是否适用于x86/x64),你可以很容易地转移R离开 E-(sizeof(unsigned)*CHAR_BIT)位,你就完成了。否则结果将是 R*(E**(sizeof(unsigned)*CHAR_BIT)) (其中 ** 表示的幂)

如果性能是一个问题,您可以为您的 bignum 类添加一个重载以乘以 std::constant_integer<unsigned, 10> ,它只返回 (LHS<<4)+(LHS<<2) .如果您愿意,您可以类似地优化其他常量。

关于c++ - 在 C++ 中转换大整数 <-> double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12323668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com