Re[9]: C# - идея расширения для where - новое ограничение дл
От: _FRED_ Черногория
Дата: 19.01.10 03:14
Оценка:
Здравствуйте, venicum, Вы писали:

V>Я не сказал, что ваш пример не верен, я также не говорил в своем посте, что сравнивать числа с плавающей точкой явно нельзя.


Сказали, что

В принципе при сравнении двух дробных чисел нельзя использовать явную проверку на равенство, нужно проверять
является ли модуль разности менее какой-либо точности, определенной для данной задачи.

Отквоченное не верно. В моём примере числа можно сравнивать безо всякого "модуля разности".

V>Мой пример показывает, что такое сравнение не всегда корректно


Я этого и не оспаривал, но "не всегда корректно" как-то не следует из ваших слов (см. цитату выше).
Help will always be given at Hogwarts to those who ask for it.
Re[2]: (double)0.001f = 0.0010000000474974513. Почему???
От: barn_czn  
Дата: 19.01.10 03:22
Оценка: -4 :)
согласитесь, что приведение от float к double — это в некотором смысле повышение точности переменной, и от повышения точности не должно возникать каких то погрешностей. а они возникают, что очень странно.

а про представление в 2м виде — да мне все равно как оно там хранится,
у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется
(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.
Re[3]: (double)0.001f = 0.0010000000474974513. Почему???
От: anton_t Россия  
Дата: 19.01.10 04:18
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>согласитесь, что приведение от float к double — это в некотором смысле повышение точности переменной, и от повышения точности не должно возникать каких то погрешностей. а они возникают, что очень странно.


_>а про представление в 2м виде — да мне все равно как оно там хранится,

_>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется
_>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.

Никакой жести нет. Просто убери приведение к decimal и не морочь себе голову "объективными сравнениями", а почитай как устроены числа с плавающей запятой.
Re[3]: (double)0.001f = 0.0010000000474974513. Почему???
От: samius Япония http://sams-tricks.blogspot.com
Дата: 19.01.10 06:43
Оценка: +3 :)
Здравствуйте, barn_czn, Вы писали:

_>согласитесь, что приведение от float к double — это в некотором смысле повышение точности переменной, и от повышения точности не должно возникать каких то погрешностей. а они возникают, что очень странно.


_>а про представление в 2м виде — да мне все равно как оно там хранится,


Хранит железо, ему не поровну. Вообще под видом 0.001f хранится несколько другое число:
> 0.001f;;
val it : float32 = 0.00100000005f


_>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется

_>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.

Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)
Re[4]: (double)0.001f = 0.0010000000474974513. Почему???
От: SaZ  
Дата: 19.01.10 09:42
Оценка:
Здравствуйте, samius, Вы писали:

S>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)


Ну не сталкивался он за 7 лет с необходимостью сравнивать числа с плавающей точкой. Только вот его опыт приводит к излишней самоуверенности.
Лично я сталкивался с этим только в 1-м реальном проекте (ну и плюс лабы по мат. моделированию). Правда опыт у меня в пару-тройку раз меньше.
Re: (double)0.001f = 0.0010000000474974513. Почему???
От: Аноним  
Дата: 20.01.10 22:46
Оценка:
вообщето d == f с точки зрения float потому что у float 7 цифр после запятой
так что логично что мусор после 7 цифр

смысл в том что (d-f)<= 0.000 0001

double d = 0.001(0000000)474974513;  //7 цифр в скобках значащие и равны 0 строго ,остальные цифры могут быть чем угодно 
float  f = 0.001;
Re[3]: C# - идея расширения для where - новое ограничение дл
От: tyger Россия  
Дата: 21.01.10 05:25
Оценка:
Здравствуйте, barn_czn, Вы писали:

LVV>>Дык попробуй сам вручную перевести 0.001 из десятичной в двоичную. А потом обратно. И помедитируй над результатами.


_>Не понимаю.


_>0.001 = 1 * 10^-3, т.е.


_>Мантиса = 000...0001

_>Степень = +1 (знак "-") 000..100

_>Ну как так, кол-во нулей не важно.

_>Где здесь бесконечная периодическая двоичная запись?

Срочно в инверситет, получать профильное образование!

Иформатику в школе учил, да?
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[5]: (double)0.001f = 0.0010000000474974513. Почему???
От: barn_czn  
Дата: 21.01.10 07:34
Оценка: -2
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, samius, Вы писали:


S>>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)


SaZ>Ну не сталкивался он за 7 лет с необходимостью сравнивать числа с плавающей точкой. Только вот его опыт приводит к излишней самоуверенности.

SaZ>Лично я сталкивался с этим только в 1-м реальном проекте (ну и плюс лабы по мат. моделированию). Правда опыт у меня в пару-тройку раз меньше.

ээ, ребята, тока не на кол ))
о какой самоуверенности вы говорите? идет дискуссия, я выдвигаю аргументы. надо либо конструктивно учавствовать либо отойти в сторону.
не надо самоутверждатся на незнании других, и тем более переходить на личное типа " фу лох, ты незнаеш такой простой вещи..".
Re[4]: (double)0.001f = 0.0010000000474974513. Почему???
От: barn_czn  
Дата: 21.01.10 07:43
Оценка: -2
_>>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется
_>>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.

S>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)


ага, жесть. только вот ответа так и нет. и Вы его не дали, хотя наверняка считаете себя профессионалом ))
Re[5]: (double)0.001f = 0.0010000000474974513. Почему???
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.01.10 08:32
Оценка: 9 (2) +1
Здравствуйте, barn_czn, Вы писали:

_>>>у меня равенство (decimal)0.001f == (decimal)(double)0.001f не выполняется

_>>>(здесь приведение к decimal выполняет роль объективного сравнения), вот в чем жесть.

S>>Жесть в том, что это пишет разработчик с минимум семилетним стажем (судя по профилю)


_>ага, жесть. только вот ответа так и нет. и Вы его не дали, хотя наверняка считаете себя профессионалом ))


Ответ был неоднократно Вам дан (не мной), но судя по тому что тема продолжается, этот ответ Вас не устраивает. Вы сравниваете числа, полученные разными способами, но все равно настойчиво продолжаете упираться что не выполняется равенство, будто от этого что-то изменится в представлениях чисел.

Еще раз: нет способа представить 0.001 в float формате, потому вместо него хранится некоторое число, которое в десятичном виде с float- точностью представимо как 0.00100000005f. Но лучший способ представить такое число с помощью double-а в десятичном виде выглядит как 0.0010000000474974513. Формально это другое число.

Решить проблему этого равенства можно так
(decimal)(double)0.001f == (decimal)(double)0.001f

Но практической пользы от такого решения на грош.

Можно так же сравнивать на совпадение округленные до какого-то знака числа.
Re[2]: (double)0.001f = 0.0010000000474974513. Почему???
От: nikov США http://www.linkedin.com/in/nikov
Дата: 21.01.10 13:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>попытайся записать 1/1000 в двоичной системе исчесления.

А>И почитай википедию

Ещё рекомендую прочитать:

Числа с плавающей запятой и их особенности
What Every Computer Scientist Should Know About Floating-Point Arithmetic
http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.16
http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.17
http://ieeexplore.ieee.org/
Re: Кстати...
От: ZAMUNDA Земля для жалоб и предложений
Дата: 21.01.10 16:49
Оценка: 6 (1)
Мне вспомнилась лекция в инсте по этой теме. Преподша написала на доске столбиком 20 чисел:
максимум
1024.0
 512.0
 256.0
 128.0
  64.0
  32.0
  16.0
   8.0
   4.0
   2.0
   1.0
   0.5        
   0.25       
   0.125      
   0.0625     
   0.03125    
   0.015625   
   0.0078125  
   0.00390625 
   0.001953125
минимум
и объявила: "Чтоб представить число с половинной точностью, нужно взять из этого ряда подряд 10 чисел и сложить некоторые из них так, чтоб сумма была максимально близкой к представляемому числу. Минимум будет <тра-ля-ля>, а максимум <тра-ля-ля>." И тоже самое рассказала про одинарную и двойную точность, а потом и про расширенную заикнулась отдельно. Ну она кнешно объяснила как этот ряд делается и всякие сухости в итоге, но с такой таблицей было сразу многое понятно.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.