Слегка отличается от значения мантиссы в printf

Я совершенно новичок в языке C. Пытаюсь подобрать здесь. Надеюсь, вы, ребята, можете мне немного помочь, и заранее извините, если я спросил что-то глупое, но я не смог найти никакого ответа на этот конкретный вопрос. также извините за мой английский.

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

#include <stdio.h>

int main(int argc, const char * argv[])
{


// float variable named "Crit_Dmg"
float Crit_Dmg;

// give "Crit_Dmg" a value
Crit_Dmg = 11.34;


// Log it to the user
printf("Critical Damage = %f.\n", Crit_Dmg);

// Declare Float variable named "Magic_Dmg"
float Magic_Dmg;

// Give Magic_Dmg a value
Magic_Dmg = 5.48;


// Show user
printf("Magical Damage = %f.\n", Magic_Dmg);

// Declare Double variable named "T_Dmg" (Total Dmg)
double T_Dmg;

// calculation of total damage (T_Dmg)
T_Dmg = Crit_Dmg + Magic_Dmg;

// show user Totas Dmg value
printf("Total Damage = %f.\n", T_Dmg);

// end
return 0;

}

результат printf показывает

Critical Damage = 11.340000.
Magical Damage = 5.480000.
Total Damage = 16.820000.
Program ended with exit code: 0

но когда я увеличиваю значение Crit_Dmg и Magic_Dmg выше, мантисса просто неточна в соответствии с моим вводом ...

например, я изменил на

Crit_Dmg = 115.34;

Magic_Dmg = 515.48;

printf выглядит так, как показано ниже

Critical Damage = 115.339996.
Magical Damage = 515.479980.
Total Damage = 630.819946.
Program ended with exit code: 0

почему мантисса не отображается в соответствии с моим вводом? как мне это исправить?


person Deetee    schedule 23.03.2014    source источник
comment
Есть злые исключения с плавающей запятой!   -  person haccks    schedule 23.03.2014
comment
Вздох: floating-point-gui.de.   -  person Oliver Charlesworth    schedule 23.03.2014
comment
Итак, известно, но все еще неизвестно.   -  person devnull    schedule 23.03.2014
comment
Спасибо за комментарии, ребята. посмотрит на эти ссылки.   -  person Deetee    schedule 23.03.2014


Ответы (1)


Как указывали другие, числа с плавающей запятой хранятся в базе 2, чтобы максимизировать точность числа, хранящегося для заданного объема памяти, но не все десятичные числа в базе 10 имеют точные представления в базе 2, поэтому иногда в базе 2 будут ошибки округления. чего вы не увидите в базе 10, хотя общая точность для произвольных чисел лучше, чем при использовании базы 10.

Самое простое исправление - отформатировать вывод более явно:

printf("Critical Damage = %.2f.\n", Crit_Dmg);
person Douglas    schedule 23.03.2014
comment
Спасибо за советы бро. :D - person Deetee; 23.03.2014