BigInteger に格納された 160 ビットの数値を使用する C# システムがあります。これらのものを円で表示したい、つまり、0->2^160 範囲を 0->2Pi 範囲にマッピングすることを意味します。どうすればいいですか?
すぐに思い浮かぶアプローチは、
BigInteger number;
angle = (number / pow(2, 160)) * TwoPi;
ただし、除算によって結果が整数に切り捨てられるため、複雑です。
BigInteger に格納された 160 ビットの数値を使用する C# システムがあります。これらのものを円で表示したい、つまり、0->2^160 範囲を 0->2Pi 範囲にマッピングすることを意味します。どうすればいいですか?
すぐに思い浮かぶアプローチは、
BigInteger number;
angle = (number / pow(2, 160)) * TwoPi;
ただし、除算によって結果が整数に切り捨てられるため、複雑です。
わかりました、もう一度、最初から。
BigInteger は 0 -> 2^160 であるため、10^(-308) から 10^(+308) までを含むことができる double よりも小さいです。
BigInteger から double への明示的な変換があります。
だからあなたはこれをします:
BigInteger number;
var angle = ((double)number / Math.Pow(2, 160)) * TwoPi;
正確さが失われることはわかっていますが、サークルでは問題になりません。
私は C# やその大きな整数について何も知らないので、ここに暗闇の中での刺し傷があります。
ディスプレイが (丸い) サッカー場ほどの大きさでない限り、ディスプレイの精度は、1 だけ離れている (または 10 または 100または10000000または10 ^ 40でも、それを理解する必要があります)。
私は単純に大きな整数を切り捨て、最上位の 32 ビットを取り、それらを符号なし整数として扱い、それ2^32
を [0,1) の範囲に分割して (分割時に浮動小数点に変換します)、プロットします。それは円の周りを回っています。
大きな整数を切り捨てて左端の 32 ビットを取得することは、それを で割ることと同じだと思い2^128
ますが、より良いビットシフトのアプローチがあるか、単純に直接ビットを取得できる可能性があります。