|
|
|
Forum Member
      
участник
Last Login: 31.12.2006 22:53
Сообщ.: 35,
Visits: 276
|
|
Пишем код:
float x=432.2;
x=x-432;
По логике и согласно арифметике:
x=0.2
А по мнению ВСЕХ компилеров С++/С
x=0.20001221
При добавлении целой части, в размере >200 остаток исчезает...
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
| последствия приведения типов float -> double -> float, int -> double -> float
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.01.2008 15:09
Сообщ.: 329,
Visits: 3 604
|
|
Очень неприятная вещь для научных вычислений и графики. При количестве итераций около 100 этот глюк становится заметен.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 27.03.2008 15:26
Сообщ.: 701,
Visits: 7 028
|
|
x=0.20001221 При добавлении целой части, в размере >200 остаток исчезает...
Это не глюк! Это известная вещь, которая называется значимостью числа. Сейчас я конечно навскидку не помню, но у каждого формата double, float есть количество цифр, которое является значимым. Допустим для float это 8 получаем, что при добавлении 200 к 0.20001221 число становится равным 200.20001221. Отсчитываем от начала 8 цифр (значимых) и получаем 200.2000 А неровный остаток x=0.20001221 из-за хранения числа в 16-ричном виде, а не в десятичном.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 27.03.2008 15:26
Сообщ.: 701,
Visits: 7 028
|
|
| Исправление Отсчитываем от начала 8 цифр (значимых) и получаем 200.20001 На самом деле там несколько сложнее, но принцип таков.
|
|
|
|
|
Forum Member
      
участник
Last Login: 31.12.2006 22:53
Сообщ.: 35,
Visits: 276
|
|
| Все намного проще... Слава Богу, есть такой предмет как ОФЭВМ (Организация функционирования ЭВМ).... Вот там и объяснили в чем же заключается соль...
|
|
|
|
|
Supreme Being
      
модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298,
Visits: 12 501
|
|
|
|
|