Глюк
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Глюк Expand / Collapse
Автор
Сообщение
10.05.2006 10:24
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum 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 остаток исчезает...
Сообщ. #896778
10.05.2006 13:05
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
последствия приведения типов float -> double -> float, int -> double -> float
Сообщ. #896799
10.05.2006 13:37


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.01.2008 15:09
Сообщ.: 329, Visits: 3 604
Очень неприятная вещь для научных вычислений и графики. При количестве итераций около 100 этот глюк становится заметен.

Сообщ. #896803
24.05.2006 9:45


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme 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-ричном виде,

а не в десятичном.

Сообщ. #897426
24.05.2006 9:53


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 27.03.2008 15:26
Сообщ.: 701, Visits: 7 028
Исправление

Отсчитываем от начала 8 цифр (значимых) и получаем 200.20001

На самом деле там несколько сложнее, но принцип таков.

Сообщ. #897428
05.07.2006 7:47
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 31.12.2006 22:53
Сообщ.: 35, Visits: 276
Все намного проще... Слава Богу, есть такой предмет как ОФЭВМ (Организация функционирования ЭВМ).... Вот там и объяснили в чем же заключается соль...
Сообщ. #900106
05.07.2006 11:49
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
http://www.parashift.com/c++-faq-lite/newbie.html

вопрос № [29.16]
Сообщ. #900113
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 6:49