Отображение BigInteger на круг - PullRequest
1 голос
/ 28 апреля 2010

У меня есть система C #, использующая 160-битные числа, хранящиеся в BigInteger. Я хочу отобразить эти вещи по кругу, что означает отображение диапазона 0-> 2 ^ 160 в диапазон 0-> 2Pi. Как бы я это сделал?

Подход, который мгновенно приходит на ум:

BigInteger number;
angle = (number / pow(2, 160)) * TwoPi;

Однако, у этого есть сложности, потому что разделение усечет результат в целое число.

Ответы [ 3 ]

2 голосов
/ 28 апреля 2010

Хорошо, опять же, с самого начала.

Поскольку ваш BigInteger от 0 -> 2 ^ 160, он меньше двойного, который может содержать от 10 ^ (- 308) до 10 ^ (+ 308).

Существует явное преобразование из BigInteger в удвоение .

Итак, вы делаете это:

BigInteger number;
var angle = ((double)number / Math.Pow(2, 160)) * TwoPi;

Я знаю, что вы потеряете точность, но это не должно иметь значения на круге.

1 голос
/ 28 апреля 2010

Я ничего не знаю о C # или его больших целых числах, поэтому вот удар в темноте:

Если ваш дисплей не имеет размер (круглого) футбольного поля, вы должны будете признать, что точность вашего дисплея будет намного меньше, чем требуется, чтобы показать любое разделение между числами, которые разделяют только 1 (или 10 или 100 или 10000000 или даже 10 ^ 40, но вы должны это выяснить).

Я бы просто обрезал мое большое целое число, взял бы 32 бита высшего порядка и обработал бы их как целое число без знака, а затем разделил бы его на 2^32, чтобы привести его в диапазон [0,1) (преобразовав его в число с плавающей запятой) как я делю) и построить его так далеко вокруг круга.

Полагаю, усечение большого целого числа для получения самых левых 32 битов эквивалентно делению его на 2^128, но может быть лучший подход со сдвигом бит или вы можете просто захватить биты напрямую.

0 голосов
/ 28 апреля 2010

Нет «сложностей», потому что Math.Pow() возвращает double.Так что, пока BigInteger имеет (неявную) связь для удвоения, вы готовы идти.

...