Я знаю, что плавающие точки в C не очень точны. Но у меня есть снайпер, где я не понимаю, почему я получаю такие результаты. Во-первых, если я вычисляю в одной строке, я получаю неправильный результат «0». Просто, если я разделил те же вычисления на несколько команд, я получаю почти то, что ожидаю.C math lib - просчеты с плавающей точкой?
Так первые вопросы:
- Почему одна строка отличается от расщепленных линий?
- Есть ли способ, как рассчитать более точный способ? Я имею в виду, что 320- (10,44 * 4) должны быть 278,24, а не 278,23999! Я понимаю проблемы округления при числе, например, корнях или пи. Но не в приведенном выше примере.
Ok, вот мой код (минимизируется sniplet):
#include <math.h>
#include <stdio.h>
float kurv_steil,
kurv_korr,
t_abl_s,
t_out,
t_abl_s,
b,
t_tank_s;
void main()
{
t_tank_s=32;
kurv_steil=0.85;
kurv_korr=-5;
t_out=1.44;
t_abl_s=24;
printf("Werte: k_steil: %f k_korr: %f t_out: %f t_abl_s: %f\n",kurv_steil,kurv_korr,t_out,t_abl_s);
b= pow(t_abl_s,(t_out/(320-(t_out*4))))*0.65*kurv_steil*b*(-t_out+20);
printf("[temp] Ganze Rechnung tank_s: %f\n",b);
b=320-(t_out*4);
printf("[temp] 320-(t_out*4) b: %f\n",b);
b=t_out/b;
printf("[temp] t_out/b b: %f\n",b);
b=pow(t_abl_s,b);
printf("[temp] t_abl_s^b b: %f\n",b);
b=0.65*kurv_steil*b;
printf("[temp] 0.65*kurv_steil*b b: %f\n",b);
b=b*(-t_out+20);
printf("[temp] b*(-t_out+20) b: %f\n",b);
b=2*b+t_abl_s+kurv_korr;
printf("[temp] 2*b*(-t_abl_s) b: %f\n",b);
}
Выход:
Werte: k_steil: 0.850000 k_korr: -5.000000 t_out: 1.440000 t_abl_s: 24.000000
[temp] Ganze Rechnung tank_s: 0.000000
[temp] 320-(t_out*4) b: 314.239990
[temp] t_out/b b: 0.004582
[temp] t_abl_s^b b: 1.014670
[temp] 0.65*kurv_steil*b b: 0.560605
[temp] b*(-t_out+20) b: 10.404831
[temp] 2*b*(-t_abl_s) b: 39.809662
Я бы ожидать, чтобы иметь первый выход имеют одинаковое значение "39.809662" , но всегда имеет значение «0». Зачем?
Отклоните свой код до того, как опубликовать его и напишите на английском, чтобы люди могли понять что-то еще. – LPs
Подпись для main может быть: 'int main (void)' или 'main (int argc, char * argv [])' – LPs
Простая вещь, которую вы можете сделать, это изменить форматирование для печати чисел, а не пытаться использовать '% f' '% .3f' или'% 6.3f'. Математика в C очень точная, более того, результаты не всегда кажутся красивыми в десятичных знаках. –