Проблемы двойной точности на.NET

В Python есть множество микросервисных фреймворков, которые значительно упростили бы код, который вы должны написать.

Попробуйте, например, pymacaron ( http://pymacaron.com/ ). Вот пример API-интерфейса helloworld, реализованного с помощью pymacaron: https://github.com/pymacaron/pymacaron-helloworld

Служба pymacaron требует от вас только: (1) написать Swagger спецификация для вашего API (который всегда является хорошей отправной точкой, независимо от того, какой язык вы используете). Ваш файл swagger описывает вызовы get / post / etc вашего API и какие объекты (json dicts) они получают и возвращают, а также какой метод python в вашем коде реализует конечную точку. (2) и реализовать методы ваших конечных точек.

Как только вы это сделаете, вы получите множество вещей бесплатно: вы можете упаковать свой код в докер-контейнер, развернуть его на amazon beanstalk, запустить асинхронные задачи из ваших вызовов API или получить документацию API без дополнительных затрат. Работа.

17
задан Uwe Keim 21 November 2012 в 13:18
поделиться

9 ответов

Если Вы опускаете все постфиксы F (т.е. -12.1 вместо -12.1F) Вы получите равенство нескольким цифрам больше. Ваши константы (и особенно математические ожидания) являются теперь плаваниями из-за F. При выполнении этого нарочно затем, объясните.

, Но для остальных я соглашаюсь с другими ответами при сравнении двойных или значений плавающих для равенства, это просто не надежно.

6
ответ дан 30 November 2019 в 11:32
поделиться

Арифметика с плавающей точкой на компьютерах не является Точной Наукой :).

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

8
ответ дан 30 November 2019 в 11:32
поделиться

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

, Например, non-representability 0,1 и 0.01 (в двоичном файле) означает, что результат попытки к квадратным 0.1 ни 0.01, ни представимое число, самое близкое к нему.

Только плавающая точка использования, если Вы хотите интерпретацию машины (двоичный файл) систем счисления. Вы не можете представить 10 центов.

5
ответ дан 30 November 2019 в 11:32
поделиться

Если Вы хотите точность, используйте Систему. Десятичное число. Если Вы хотите скорость, используйте Систему. Дважды (или Система. Плавание). Числа с плавающей точкой не являются "бесконечной точностью" числа и поэтому утверждение, что равенство должно включать допуск. Пока Ваши числа имеют разумное число значащих цифр, это в порядке.

  • , Если Вы надеетесь делать математику на очень больших И очень небольших числах, не используйте плавание или дважды.
  • при необходимости в бесконечной точности не используйте плавание или дважды.
  • при агрегации очень большого количества значений не используйте плавание, или дважды (ошибки соединят себя).
  • при необходимости в скорости и размере используйте плавание или дважды.

Видят этот ответ (также мной) для подробного анализа того, как точность влияет на результат Ваших математических операций.

5
ответ дан 30 November 2019 в 11:32
поделиться

Проверьте ответы на этот вопрос: это безопасный проверить значения с плавающей точкой на равенство 0?

Действительно, просто проверьте на "в рамках допуска..."

3
ответ дан 30 November 2019 в 11:32
поделиться

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

, Если Вам не нужна точность мимо определенного момента, затем возможно, десятичное число будет работать лучше на Вас. Это имеет более высокую точность, чем дважды.

1
ответ дан 30 November 2019 в 11:32
поделиться

For the similar issue, I end up using the following implementation which seems to success most of my test case (up to 5 digit precision):

public static double roundValue(double rawValue, double valueTick)
{
    if (valueTick <= 0.0) return 0.0;

    Decimal val = new Decimal(rawValue);
    Decimal step = new Decimal(valueTick);
    Decimal modulo = Decimal.Round(Decimal.Divide(val,step));

    return Decimal.ToDouble(Decimal.Multiply(modulo, step));
}
0
ответ дан 30 November 2019 в 11:32
поделиться

Я действительно хотел бы, чтобы они не реализовали оператор == для чисел с плавающей запятой и двойных чисел. Почти всегда неправильно спрашивать, равно ли двойное или плавающее значение любому другому значению.

11
ответ дан 30 November 2019 в 11:32
поделиться

Иногда результат более точен, чем вы ожидаете от строгого: FP IEEE 754. Это потому, что HW использует больше битов для вычисления. См. Спецификация C # и Эта статья

Java имеет ключевые слова java и C ++ имеют компиляторы коммутаторов. Я скучаю по этому варианту в .NET

0
ответ дан 30 November 2019 в 11:32
поделиться