带有BIG NUMBERS的modf()

时间:2012-03-21 13:43:24

标签: c++ indexing double modulo

我希望这能找到你。

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

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

...

我们都可以看到,第四个索引对应一个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()使用64位数字,如unsigned long long?我担心如果不可能,我将被限制为双倍长度的数字。

有人可以请我吗? =)

2 个答案:

答案 0 :(得分:1)

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

如果你需要更大的数字,那么你需要使用一个大整数库。但是,如果你感兴趣的只是模数,那么你可以根据以下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)是一个可以预先计算的常数。

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

答案 1 :(得分:0)

我实际上可以使用之后删除的评论(奇怪为什么),说:

modulus = a - a/b * b;

我在分区中投了一个无符号长长的投手。 现在......我有点失望,因为在我的问题中我认为我可以继续提高单词的字符数没有问题。尽管如此,我已经开始在chars = 7的范围内获得尺寸问题了。为什么? 95 ^ 7开始给出巨大的数字。 我希望有可能写一个像“我的猫很胖我1234r5s”这样的词并计算出它的索引,但这个词有近30个字符: 95^26 = 2635200944657423647039506726457895338535308837890625组合。 无论如何,谢谢你的回答。