Я бы сказал, что ошибки в программах связанные с особенностями чисел в формате плавающей точки это не просто "грабли", а "подводные грабли". По аналогии с "подводными камнями"...
Не всем же преподают вычислительную математику. Да и не все её учат, даже если им преподают.
Хотя, IMHO, достаточно знать несколько свойств/характеристик представления чисел с плавающей точкой и логично мыслить, чтобы избегать ошибок.
Есть несколько примеров (чуть позже попробую найти откуда я это взял).
Результаты удивят, конечно же, не всех, но, думаю, что многих!
Те кого результаты не удивят и так, думается, знают почему оно так получается.
А вот остальным надо бы задуматься, что у них есть пробел
И не смотрите, что в примерах используется тип float (одинарная точность), для double тоже можно придумать.
Только что проверил эти примеры на
gcc version 4.7.2 20130108 [gcc-4_7-branch revision 195012] (SUSE Linux)
Спойлер
Код: Выделить всё
#include "stdio.h"
int
main(int argc, char *argv[])
{
float a, b, f;
a=123456789;
b=123456788;
f=a-b;
printf("Result: %f\n", f);
return 0;
}
Код: Выделить всё
#include "stdio.h"
int
main(int argc, char *argv[])
{
float a;
double b, f;
a=123456789.123457;
b=123456789.123457;
f=a-b;
printf("Result: %f\n", f);
return 0;
}
Код: Выделить всё
#include "stdio.h"
int
main(int argc, char *argv[])
{
float a, b, c, d;
a = 1.0;
b = 3.0;
c = a / b;
d = (c - 1.0/3.0) * 1e9;
printf("Result: %f\n", d);
return 0;
}
Код: Выделить всё
#include "stdio.h"
int
main(int argc, char *argv[])
{
float a, b;
long n;
a = 300;
b = 0.00001;
for (n=30000000; n>0; n--) {
a=a-b;
}
printf("Result: %f\n", a);
return 0;
}Вот (или так) откуда примеры.
Там и подробности представления чисел с плавающей точкой по стандарту IEEE 754 и описание возможных проблем.
И всё это с картинками и на русском.

only pure true norwegian blackx 

