2012-03-21 6 views
0

これはあなたがうまくいくことを望みます。大きい数字のmodf()

単語のインデックス(数値)をASCIIコードで変換しようとしています。 EX用 :

index 0 -> " " 
index 94 -> "~" 
index 625798 -> "[email protected]" 
index 899380 -> "!$^." 

...

我々はすべてが見ることができるように、第4回インデックスは4文字の文字列に対応しています。残念ながら、ある時点では、これらの組み合わせは実際に大きくなります(つまり、8文字の単語の場合、16桁の数字(例:6634204312890625)で操作する必要があります。ワード)。

私のプログラムのいくつかの変数をunsigned intからunsigned long longにアップグレードしなければならなかったが、その後C++のmodf()が倍精度とuint32_t(http://www.raspberryginger)を使用することに気付きました。 com/jbailey/minix/html/modf_8c-source.html)。

質問があります:これは、unsigned long longのような64ビットの数値を使用するためにmodf()に適応できますか?私はこれが可能でない場合には、私は二重の長さの桁に制限されることになるのではないかと恐れています。

誰でも私を喜ばせることができますか? =)

+0

http:// gmplibがあります。org /有用な – LucasB

+2

大きな番号が必要な場合は、大きな機能が必要です。 – ApprenticeHacker

+0

私はモジュロ演算子を '%'の代わりに浮動小数点変数 'modf'に使用する理由を理解していません。どのようにマッピングを正確に行いますか、なぜそれを必要としますか?簡単な方法があるかもしれません... – jofel

答えて

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_hiは8最上位桁で、かつ x_lo最下位
x = x_hi * 1e8 + x_lo; // this is pseudocode, not real C 

mod(1e8)はあなたが事前計算できる定数である
mod(x) = mod((mod(x_hi) * mod(1e8) + mod(x_lo)); 

xの弾性率は、その後のように表すことができます。

これはすべて整数演算で行うことができます。

私が実際に言った右(なぜだろう)した後、削除されたコメント、使用することができます
+0

私は実際に削除されたコメントを使用することができました。 –

0

modulus = a - a/b * b; 

を私は符号なしlong longに部門のキャストを作りました。 ...私の問題では問題のない単語の文字数を引き上げることができると思っていたので、少し失望しました。それにもかかわらず、私はchars = 7のn.ºでサイズの問題を出し始めました。なぜですか? 95^7は巨大な数値を出し始める。 私は "私の猫はとても太っています1234r5s"のような言葉を書く可能性を得ることを望んでいましたが、この指数を計算しますが、この単語は約30文字です。 95^26 = 2635200944657423647039506726457895338535308837890625の組み合わせです。とにかく、お返事ありがとうございます。

関連する問題