Первая проблемаC/C++ Арифметическое выражение с двойными числами - странные результаты - перевод на Яве
В коде C у меня есть это выражение:
double completeExpression = x1 - h*exp(-lambda*t);
я разделить его на две операции:
double value = h*exp(-lambda*t);
double subtraction = x1 - value;
Проблема в том, что вычитание отличается от полного выражения. Что случилось?
Я воспроизвел странные результаты в моем коде с этой строки:
const double TOLERANCE = 1e-16;
double h = 0.51152525298500628;
double lambda =0.99999999999999978;
double t=0.1;
double x1 =0.4628471891711442 ;
double completeExpression = x1 - h*exp(-lambda*t);
double value = h*exp(-lambda*t);
double subtraction = x1 - value;
printf("x1 = %1.4e & value = %1.4e",x1,value);
printf("\ncompleteExpression = %1.4e",completeExpression);
printf("\nsubtraction = %1.4e",subtraction);
Результаты:
x1 = 4.6285e-001 & value = 4.6285e-001
completeExpression = 8.2779e-017
subtraction = 5.5511e-017
Вторая проблема:
я должен перевести completeExpression в Java, и я всегда возвращал результат плохого результата (вычитания) и не полныйExpression:
Код:
static double TOLERANCE = 1e-16;
public static void main() {
double h = 0.51152525298500628;
double lambda =0.99999999999999978;
double t=0.1;
double x1 =0.4628471891711442 ;
double completeExpression = x1 - h*Math.exp(-lambda*t);
double value = h*Math.exp(-lambda*t);
double subtraction = x1 - value;
System.out.println("x1 = " + String.format("%1.4e", value) + "& value = " + String.format("%1.4e",x1));
System.out.println("\ncompleteExpression = " + String.format("%1.4e",completeExpression));
System.out.println("\nsubtraction = " + String.format("%1.4e",subtraction));
#gcc --version
My Gcc Version:
$ gcc --version
gcc.exe (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Проверьте это: http://stackoverflow.com/questions/31418209/double-multiplication-differs-between-compile-time-and-runtime-in-32-bit-platfor – ouah
Похож на очень распространенную вычислительную маржу, когда работа с нецелыми – YePhIcK
Расчеты с плавающей точкой неточны; следовательно, полагаясь на точные результаты (например, тестирование двух чисел является неравномерным) является плохой идеей. Если вы увеличиваете точность в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Hurkyl