Изучая си...
Oct. 8th, 2009 04:49 pmСтолкнулся с забавным затыком, нужно было исключить срабатывания при переменной xtra равной 1, 5, 25 и 125. Я записал:
В результате срабатывало всегда! Просто взорвал себе мозг, оказывается надо было записать
Банально, но был долгий затык. Народ, скажите, как мне сравнивать значения типа float? Задача определить чётко, после вычислений - равно ли оно заданному значению.
Округляю число так:
При каждом запуске программы младшие биты разные, хотя вычисление идёт со строго вбитыми в программу константами (т.е. метод неизменен).
UPD Сей дурацкий на первый взгляд вопрос, возник при разборе полётов одной программы. Она выводит число с кучей знаков после запятой. Когда я компилятором вывожу число с 7 знаками после запятой, то выходит другое число, когда я округляю алгоритмом приведёным выше (5 знаков после запятой), то близкое к округленю компилятором, но очень отличающееся от исходного. Вот например:

...
if ((xtra != 1) || (xtra != 5) || (xtra != 25) || (xtra != 125)) {
...}
В результате срабатывало всегда! Просто взорвал себе мозг, оказывается надо было записать
...
if ((xtra != 1) && (xtra != 5) && (xtra != 25) && (xtra != 125)) {
...}
Банально, но был долгий затык. Народ, скажите, как мне сравнивать значения типа float? Задача определить чётко, после вычислений - равно ли оно заданному значению.
Округляю число так:
ErValue *= 100000; ErValue = ceil(ErValue); ErValue /= 100000;
При каждом запуске программы младшие биты разные, хотя вычисление идёт со строго вбитыми в программу константами (т.е. метод неизменен).
UPD Сей дурацкий на первый взгляд вопрос, возник при разборе полётов одной программы. Она выводит число с кучей знаков после запятой. Когда я компилятором вывожу число с 7 знаками после запятой, то выходит другое число, когда я округляю алгоритмом приведёным выше (5 знаков после запятой), то близкое к округленю компилятором, но очень отличающееся от исходного. Вот например:
