Почему Система. Математика и например MathNet. Численные данные на основе дважды?

Другие сказали Вам, как сделать это правильно. Но я удивлен, что никто не сказал Вам, что этот код на самом деле опасен:

this->ButtonFunc = &ButtonFunc;

, Так как ButtonFunc является параметром, он выйдет из объема, когда функция возвратится. Вы берете его адрес. Вы получите значение типа void (object::**ButtonFunc)() ( указатель на указатель на функцию членства ) и присвоите его этому-> ButtonFunc. В то время, когда Вы попытались бы использовать это-> ButtonFunc, Вы попытаетесь получить доступ к устройству хранения данных (теперь не существующий больше) локальный параметр, и Ваша программа, вероятно, отказала бы.

я соглашаюсь с решением Commodore. Но необходимо изменить его строку на

((ButtonObj)->*(ButtonFunc))();

, так как ButtonObj указатель для возражения.

7
задан Svish 5 November 2009 в 14:28
поделиться

6 ответов

Это классический компромисс между скоростью и точностью.

Однако имейте в виду, что для PI, например, наибольшее количество цифр, которые вам когда-либо понадобятся, равно 41.

Наибольшее количество цифр пи что вам когда-либо понадобится - 41. Чтобы вычислить окружность Вселенная с ошибкой меньше, чем диаметр протона, вам нужно 41 цифры числа пи †. Кажется безопасным сделать вывод, что 41 цифра достаточно точность в пи для любого круга проблема измерения, с которой вы, вероятно, столкнетесь встреча. Таким образом, в более чем один триллион цифр числа Пи, вычисленных в 2002 г., все цифры после 41-й не имеет практического значения.

Кроме того, у decimal и double немного другая структура внутренней памяти. Десятичные дроби предназначены для хранения данных по основанию 10, а числа с плавающей запятой (и двойные) предназначены для хранения двоичных данных. На двоичной машине (как и на любом другом существующем компьютере) при сохранении любого числа в пределах своего диапазона у числа типа double будет меньше потерь.

Также учтите:

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

Как видите, у decimal меньший диапазон, но более высокая точность .

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

Нет, десятичные дроби не более "точны", чем числа типа double или любого другого типа. Концепция « точности » (когда говорят о числовых представлениях в вычислительном устройстве) является неправильной. Любой тип абсолютно 100% точен при отображении некоторых чисел. Байты без знака на 100% точны для представления целых чисел от 0 до 255. но они не годятся для дробей, отрицательных или целых чисел вне диапазона.

Десятичные дроби на 100% точны при представлении определенного набора базовые 10 значений. числа типа double (поскольку они хранят свое значение с использованием двоичного экспоненциального представления IEEE) точны при представлении набора двоичных чисел. Ни один из них не является более точным, чем другой в целом, они просто предназначены для разных целей.

Чтобы уточнить детали, так как я, кажется, недостаточно ясен для некоторых читателей ...

Если вы возьмете каждое число, которое может быть представлено в виде десятичной дроби, и пометите каждое из них на числовой строке между каждая смежная пара из них имеет дополнительную бесконечность действительных чисел, которые не могут быть представлены в виде десятичной дроби. То же самое можно сказать и о числах, которые могут быть представлены как двойные. Если бы вы пометили каждую десятичную дробь в числовой строке синим, а каждую двойную - красным, за исключением целых чисел, было бы очень мало мест, где одно и то же значение было бы отмечено обоими цветами. В общем, для 99,99999% оценок (пожалуйста, не придирайтесь к моему проценту) синий набор (десятичные дроби) представляет собой совершенно другой набор чисел из красного набора (двойные).

Это связано с тем, что по самому нашему определению синий набор состоит в том, что это представление мантиссы / экспоненты с основанием 10, а представление double - представление мантиссы / экспоненты с основанием 2. Любое значение, представленное как мантисса с основанием 2 и экспонента, (1,00110101001 x 2 ^ (-11101001101001) означает, что нужно взять значение мантиссы ( 1,00110101001 ) и умножить его на 2 в степени показатель степени (когда показатель степени отрицательный, это эквивалентно делению на 2 в степени абсолютного значения показателя степени). Это означает, что если показатель степени отрицательный, (или если любая часть мантиссы является дробно-двоичной), число не может быть представлено в виде десятичной мантиссы и экспоненты, и наоборот.

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

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

Десятичное число более точное, но имеет меньший диапазон. Обычно вы используете Double для физических и математических вычислений, но вы будете использовать Decimal для финансовых и денежных расчетов.

Подробнее см. В следующих статьях на msdn.

Двойной http://msdn.microsoft.com/en-us/library/678hzkk9.aspx

Десятичный http://msdn.microsoft.com/en-us/library/364x0z75.aspx

3
ответ дан 6 December 2019 в 07:27
поделиться

Ни Decimal, ни float, ни double не подходят, если вам требуется что-то точное. Кроме того, Decimal настолько дорог и слишком часто используется, что становится обычной шуткой.

Если вы работаете с дробями и требуете максимальной точности, используйте дроби. Это то же старое правило: конвертировать только один раз и только тогда, когда это необходимо. Ваши правила округления тоже будут различаться в зависимости от приложения, домена и так далее, но вы обязательно найдете один или два странных примера, где это подходит. Но опять же, если вам нужны дроби и максимальная точность, ответ - не использовать ничего, кроме дробей. Учтите, что вам может потребоваться функция произвольной точности.

Актуальная проблема с CLR в целом состоит в том, что реализация библиотеки, которая имеет дело с числами в общем виде, является настолько странным и явным, во многом из-за плохого примитивного дизайна и недостатков самого популярного компилятора для платформы. Это почти то же самое, что и с фиаско с Java.

double оказывается лучшим компромиссом, охватывающим большинство доменов, и он работает хорошо, несмотря на то, что MS JIT все еще не может использовать технологию ЦП, которой уже около 15 лет. .

[часть для пользователей компиляторов замедления MSDN]

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

Если бы я рискнул предположить, я бы сказал, что эти функции используют низкоуровневую математическую функциональность (возможно, в C), которая не использует десятичные дроби внутри, и поэтому возвращает десятичное в любом случае потребуется преобразование от двойного к десятичному. Кроме того, цель типа десятичного значения - обеспечить точность; эти функции не возвращают и не могут возвращать 100% точные результаты без бесконечной точности (например, иррациональные числа).

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

Double - это встроенный тип. Is поддерживается ядром FPU / SSE (ранее известным как «математический сопроцессор»), поэтому он невероятно быстр. Особенно при умножении и научных функциях.

Десятичное число на самом деле представляет собой сложную структуру, состоящую из нескольких целых чисел.

0
ответ дан 6 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

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