Как вы уже поняли, согласно другому ответу, удваивает работу с помощью двоичного числа с плавающей точкой, а не десятичного числа с плавающей точкой, и, следовательно, первоначальный подход не работает.
Также не ясно, еслион может работать с преднамеренно упрощенной формулой, поскольку неясно, какой максимальный диапазон вам нужен, поэтому округление становится неизбежным.
Проблема быстрого, но точного изучения хорошо изучена и часто поддерживается инструкциями ЦП.,Ваш единственный шанс победить встроенные преобразования:
- Вы совершаете математический прорыв, достойный того, чтобы об этом писали серьезные статьи.
- Вы исключаете достаточно выигранных делВ ваших собственных примерах не бывает, что, хотя встроенные модули лучше, в общем, ваша оптимизирована для вашего собственного использования.
Если диапазон значений, которые вы используете, очень ограничен, потенциал для сокращенияпри преобразовании между IEEE 754 двойной точности и длинным целым становится все меньше и меньше.
Если вы находитесь в точке, где вам нужно покрыть большинство случаев, охватываемых IEEE 754, или даже значительную их часть,тогда ты будешь делать вещи медленнее.
Я бы порекомендовал либо оставаться с тем, что у вас есть, перемещая случаи, когда double
удобнее держать в любом случае долго, несмотря на неудобства, либо, если необходимо, использовать decimal
.Вы можете легко создать decimal
из long
с помощью:
private static decimal DivideByBillion (long l)
{
if(l >= 0)
return new decimal((int)(l & 0xFFFFFFFF), (int)(uint)(l >> 32), 0, false, 9);
l = -l;
return new decimal((int)(l & 0xFFFFFFFF), (int)(uint)(l >> 32), 0, true, 9);
}
Теперь decimal
на целую величину медленнее использовать в арифметике, чем double
(именно потому, что он реализует подход, аналогичный вашемуво вводном вопросе, но с переменным показателем и большей мантиссой).Но если вам нужен просто удобный способ получить значение для отображения или рендеринга в строку, то ручное взломание преобразования в decimal
имеет преимущества по сравнению с ручным взломом преобразования в double
, поэтому может стоит посмотреть.