"~" index 625798 -> "e@A" ind-6ren">
gpt4 book ai didi

c++ - 带有大数字的 modf()

转载 作者:行者123 更新时间:2023-11-28 08:08:09 26 4
gpt4 key购买 nike

希望你一切顺利。

我正在尝试使用 ASCII 代码转换单词的索引(数字)。例如:

index 0  -> " "
index 94 -> "~"
index 625798 -> "e@A"
index 899380 -> "!$^."

...

正如我们所看到的,第 4 个索引对应一个 4 个字符的字符串。不幸的是,在某些时候,这些组合变得非常大(即,对于 8 个字符的单词,我需要使用 16 位数字执行操作(例如:6634204312890625),如果我增加字符数,情况会变得更糟单词)。

为了支持这么大的数字,我不得不将程序的一些变量从 unsigned int 升级到 unsigned long long,但后来我意识到 C++ 的 modf() 使用 double 和 uint32_t (http://www.raspberryginger.com/jbailey/minix/html/modf_8c-source.html)。

问题是:是否可以调整 modf() 以使用像 unsigned long long 这样的 64 位数字?恐怕万一这是不可能的,我将限于双倍长度的数字。

谁能启发我吗? =)

最佳答案

16 位数字适合 64 位数字的范围,因此您应该使用 uint64_t (来自 <stdint.h>)。 %运算符(operator)然后应该做你需要的。

如果您需要更大的数字,则需要使用大整数库。但是,如果您只对模数感兴趣,那么您可以根据以下 properties of modulus 使用一个技巧。 :

mod(a * b) == mod(mod(a) * mod(b))
mod(a + b) == mod(mod(a) + mod(b))

例如,让我们表示一个 16 位十进制数,x作为:

x = x_hi * 1e8 + x_lo;  // this is pseudocode, not real C

哪里x_hi是 8 个最重要的十进制数字,x_lo最不重要的。 x 的模数则可以表示为:

mod(x) = mod((mod(x_hi) * mod(1e8) + mod(x_lo));

哪里mod(1e8)是您可以预先计算的常数。

所有这些都可以用整数运算来完成。

关于c++ - 带有大数字的 modf(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805865/

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