Каков рекомендуемый тип данных для научного вычисления в .NET?

Что наиболее рекомендуемый тип данных состоит в том, чтобы использовать в научном вычислении в .NET? Это - плавание или что-то еще?

9
задан Anindya Chatterjee 2 August 2010 в 14:33
поделиться

5 ответов

Научные значения, как правило, являются «естественными» значениями (длина, масса, время и т. Д.), Где есть естественная степень неточности для начала - но где вы вполне можете захотеть очень, очень большие или очень , очень маленькие числа. Для этих значений, как правило, хорошей идеей является double . Это быстро (с аппаратной поддержкой почти везде), масштабируется вверх и вниз до огромных / крошечных значений и обычно отлично работает, если вас не интересуют точные десятичные значения.

decimal - хороший тип для «искусственных» чисел, где есть точное значение, почти всегда естественно представленное в виде десятичного числа - каноническим примером для этого является валюта. Однако он вдвое дороже, чем double с точки зрения хранения (8 байтов на значение вместо 4), имеет меньший диапазон (из-за более ограниченного диапазона экспонент) и значительно медленнее из-за отсутствия аппаратная поддержка.

Лично я бы использовал float только в том случае, если проблема с хранилищем - удивительно, как быстро могут накапливаться неточности, когда у вас всего около 7 значащих десятичных знаков.

В конечном счете, как следует из комментария «медведи съедят вас», это зависит от того, о каких ценностях вы говорите - и, конечно же, что вы планируете с ними делать. Без какой-либо дополнительной информации я подозреваю, что double - хорошая отправная точка, но вы действительно должны принимать решение в зависимости от конкретной ситуации.

16
ответ дан 4 December 2019 в 07:13
поделиться

Ну, конечно, термин «научный расчет» немного расплывчат, но в целом он двойной .

float в основном предназначен для совместимости с библиотеками, которые ожидают 32-разрядные числа с плавающей запятой. Производительность операций float и double (например, сложения) точно такая же, поэтому новый код всегда должен использовать double , потому что он имеет большую точность.

Однако x86 JITter никогда не будет встраивать функции, которые принимают или возвращают float , поэтому использование float в методах может быть медленнее. Еще раз, это сделано для совместимости: если бы он был встроен, механизм выполнения пропустил бы этап преобразования, который снижает его точность, и, таким образом, JITter мог бы непреднамеренно изменить результат некоторых вычислений, если бы он встроил такие функции.

Наконец, есть еще десятичное . Используйте это всякий раз, когда важно иметь определенное количество десятичных знаков. Стереотипным вариантом использования являются валютные операции, но, конечно, он поддерживает более двух десятичных знаков - на самом деле это 80-битный фрагмент данных.

Если даже точности 64-битного double недостаточно, рассмотрите возможность использования внешней библиотеки для чисел произвольной точности, но, конечно, вам это понадобится только в том случае, если ваш конкретный научный пример использования специально требует для этого.

8
ответ дан 4 December 2019 в 07:13
поделиться

Double кажется наиболее надежным типом данных для таких операций. Даже WPF широко использует его.

5
ответ дан 4 December 2019 в 07:13
поделиться

Я бы рекомендовал двойное число, если вам не нужно точное значение; десятичное - для финансовых расчетов, где нужна такая точность. Научные расчеты допускают небольшие погрешности, потому что вы все равно не можете точно измерить 1 метр. Float помогает только в том случае, если хранение данных является проблемой (т.е. огромные матрицы).

0
ответ дан 4 December 2019 в 07:13
поделиться

Имейте в виду, что десятичные дроби намного дороже в использовании, чем числа с плавающей запятой / удвоением (в дополнение к тому, что написали Джон Скит и Тимви).

2
ответ дан 4 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: