У меня есть алгоритм/вычисление в Java и модульном тесте на него. Модульный тест ожидает результат с некоторой точностью/дельтой. Теперь я портировал алгоритм в.NET и хотел бы использовать тот же модульный тест. Я работаю с двойным типом данных.
Проблема состоит в том, что Java использует strictfp (64 бита) для некоторых операций в Математическом классе. Где, поскольку.NET всегда использует FPU/ЦП (80 битов)..NET более точна и быстрее. Java более предсказуем.
Поскольку мой алгоритм является циклическим и снова использует результаты предыдущего раунда, error/difference/more-precision накапливается слишком большой. Я не полагаюсь на скорость (для модульного теста). И я рад использовать точность.NET в производстве, но я хотел бы проверить реализацию.
Рассмотрите это от JDK
public final class Math {
public static double atan2(double y, double x) {
return StrictMath.atan2(y, x); // default impl. delegates to StrictMath
}
}
Я ищу библиотеку или технику для использования строгого FP в.NET.
Приоритетный комментарий: Я действительно понимаю формат IEEE 754 и то, что число с плавающей точкой не является точным десятичным числом или частью. Никакое Десятичное число, никакой BigInt или BigNumber. Не отвечайте на этот путь, спасибо.
К сожалению, в C # нет способа обеспечить строгость FP, в .Net CLR просто не хватает возможности выполнять вычисления с меньшей точностью, чем это возможно. .
Я думаю, это дает прирост производительности - это не означает, что вам может потребоваться меньшая точность. В этом также нет необходимости - .Net не запускается на виртуальной машине и поэтому не беспокоится о различных процессорах с плавающей запятой.
Но разве strictfp
не является необязательным? Могли бы вы выполнить свой Java-код без модификатора strictfp
? Затем он должен использовать тот же механизм с плавающей запятой, что и .Net
. Поэтому вместо того, чтобы заставлять .Net использовать strictfp
и проверять, что он выходит с теми же значениями, что и ваш код Java, вы можете заставить Java не используйте strictfp
и убедитесь, что он будет таким же, как код .Net.