Здравствуйте, venicum, Вы писали:
V>Я не сказал, что ваш пример не верен, я также не говорил в своем посте, что сравнивать числа с плавающей точкой явно нельзя.
Сказали, что
В принципе при сравнении двух дробных чисел нельзя использовать явную проверку на равенство, нужно проверять
является ли модуль разности менее какой-либо точности, определенной для данной задачи.
Отквоченное не верно. В моём примере числа можно сравнивать безо всякого "модуля разности".
V>Мой пример показывает, что такое сравнение не всегда корректно
Я этого и не оспаривал, но "не всегда корректно" как-то не следует из ваших слов (см. цитату выше).
Help will always be given at Hogwarts to those who ask for it.
согласитесь, что приведение от float к double — это в некотором смысле повышение точности переменной, и от повышения точности не должно возникать каких то погрешностей. а они возникают, что очень странно.
а про представление в 2м виде — да мне все равно как оно там хранится,
у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется
(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.
Здравствуйте, barn_czn, Вы писали:
_>согласитесь, что приведение от float к double — это в некотором смысле повышение точности переменной, и от повышения точности не должно возникать каких то погрешностей. а они возникают, что очень странно.
_>а про представление в 2м виде — да мне все равно как оно там хранится, _>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется _>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.
Никакой жести нет. Просто убери приведение к decimal и не морочь себе голову "объективными сравнениями", а почитай как устроены числа с плавающей запятой.
Здравствуйте, barn_czn, Вы писали:
_>согласитесь, что приведение от float к double — это в некотором смысле повышение точности переменной, и от повышения точности не должно возникать каких то погрешностей. а они возникают, что очень странно.
_>а про представление в 2м виде — да мне все равно как оно там хранится,
Хранит железо, ему не поровну. Вообще под видом 0.001f хранится несколько другое число:
> 0.001f;;
val it : float32 = 0.00100000005f
_>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется _>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.
Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)
Здравствуйте, samius, Вы писали:
S>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)
Ну не сталкивался он за 7 лет с необходимостью сравнивать числа с плавающей точкой. Только вот его опыт приводит к излишней самоуверенности.
Лично я сталкивался с этим только в 1-м реальном проекте (ну и плюс лабы по мат. моделированию). Правда опыт у меня в пару-тройку раз меньше.
Здравствуйте, barn_czn, Вы писали:
LVV>>Дык попробуй сам вручную перевести 0.001 из десятичной в двоичную. А потом обратно. И помедитируй над результатами.
_>Не понимаю.
_>0.001 = 1 * 10^-3, т.е.
_>Мантиса = 000...0001 _>Степень = +1 (знак "-") 000..100
_>Ну как так, кол-во нулей не важно. _>Где здесь бесконечная периодическая двоичная запись?
Срочно в инверситет, получать профильное образование!
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте, samius, Вы писали:
S>>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)
SaZ>Ну не сталкивался он за 7 лет с необходимостью сравнивать числа с плавающей точкой. Только вот его опыт приводит к излишней самоуверенности. SaZ>Лично я сталкивался с этим только в 1-м реальном проекте (ну и плюс лабы по мат. моделированию). Правда опыт у меня в пару-тройку раз меньше.
ээ, ребята, тока не на кол ))
о какой самоуверенности вы говорите? идет дискуссия, я выдвигаю аргументы. надо либо конструктивно учавствовать либо отойти в сторону.
не надо самоутверждатся на незнании других, и тем более переходить на личное типа " фу лох, ты незнаеш такой простой вещи..".
_>>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется _>>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.
S>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)
ага, жесть. только вот ответа так и нет. и Вы его не дали, хотя наверняка считаете себя профессионалом ))
Здравствуйте, barn_czn, Вы писали:
_>>>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется _>>>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.
S>>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)
_>ага, жесть. только вот ответа так и нет. и Вы его не дали, хотя наверняка считаете себя профессионалом ))
Ответ был неоднократно Вам дан (не мной), но судя по тому что тема продолжается, этот ответ Вас не устраивает. Вы сравниваете числа, полученные разными способами, но все равно настойчиво продолжаете упираться что не выполняется равенство, будто от этого что-то изменится в представлениях чисел.
Еще раз: нет способа представить 0.001 в float формате, потому вместо него хранится некоторое число, которое в десятичном виде с float- точностью представимо как 0.00100000005f. Но лучший способ представить такое число с помощью double-а в десятичном виде выглядит как 0.0010000000474974513. Формально это другое число.
и объявила: "Чтоб представить число с половинной точностью, нужно взять из этого ряда подряд 10 чисел и сложить некоторые из них так, чтоб сумма была максимально близкой к представляемому числу. Минимум будет <тра-ля-ля>, а максимум <тра-ля-ля>." И тоже самое рассказала про одинарную и двойную точность, а потом и про расширенную заикнулась отдельно. Ну она кнешно объяснила как этот ряд делается и всякие сухости в итоге, но с такой таблицей было сразу многое понятно.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков