0.8*10=?
От: vadimcher  
Дата: 13.07.07 20:05
Оценка:
Этюд-не этюд, но по крайней мере полезное упражнение.

Сколько будет (int)( (0.1+0.7)*10 )?

А вот зайца кому, зайца-выбегайца?!
Re: 0.8*10=?
От: ole! США http://files.rsdn.org/4543/rsdn.gif
Дата: 13.07.07 20:13
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Этюд-не этюд, но по крайней мере полезное упражнение.


V>Сколько будет (int)( (0.1+0.7)*10 )?


зависит от
my $.02
Re: 0.8*10=?
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.07.07 20:14
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Этюд-не этюд, но по крайней мере полезное упражнение.


V>Сколько будет (int)( (0.1+0.7)*10 )?


Опять про приближение десятичных дробей во floatах?
Re: Сэм-восем...
От: Erop Россия  
Дата: 14.07.07 12:45
Оценка: 1 (1) +2 :))
Здравствуйте, vadimcher, Вы писали:

V>Сколько будет (int)( (0.1+0.7)*10 )?


Да моли что буедт!
7 скорее всего, а если очень повезёт, то 8
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Сэм-восем...
От: Vintik_69 Швейцария  
Дата: 14.07.07 16:52
Оценка: 1 (1)
Здравствуйте, Erop, Вы писали:

E>Да моли что буедт!

E>7 скорее всего, а если очень повезёт, то 8

Ну по постановке вопроса можно заключить, что, скорее, 7
Re: 0.8*10=?
От: vip_stv  
Дата: 15.07.07 08:42
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Этюд-не этюд, но по крайней мере полезное упражнение.


V>Сколько будет (int)( (0.1+0.7)*10 )?


Неужели 0 ?
Re[2]: 0.8*10=?
От: Аноним  
Дата: 16.07.07 05:07
Оценка:
7 будет.
т/к компилятор как правило получает значения вещественных чисел приблизительно в диапазоне
например 6.0 * 8.0
будет как 47.999999993. когда мы выделяем целую часть получается понятно что
Re[3]: 0.8*10=?
От: VEAPUK  
Дата: 17.07.07 14:36
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>7 будет.

А>т/к компилятор как правило получает значения вещественных чисел приблизительно в диапазоне
Скорее имелось ввиду совсем не время компиляции
А>например 6.0 * 8.0
А>будет как 47.999999993. когда мы выделяем целую часть получается понятно что
6.0*8.0 будет 48.0
Спасибо автору за то, что заставил перечитать правило преобразования типов...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: 0.8*10=?
От: Кодт Россия  
Дата: 17.07.07 15:20
Оценка: 6 (1)
Здравствуйте, <Аноним>, Вы писали:

А>7 будет.

А>т/к компилятор как правило получает значения вещественных чисел приблизительно в диапазоне
А>например 6.0 * 8.0
А>будет как 47.999999993. когда мы выделяем целую часть получается понятно что

А вот тут-то мы вас и поправим!
Оба числа, 6.0 и 8.0 представимы во float, поэтому ошибки представления не возникает. Далее, результат умножения не вылез из мантиссы, поэтому ошибки нормализации снова не возникает. Так что получаем чистые 48.0, округляемые вниз до 48

Что же касается 0.1, 0.7, 0.8 — они непредставимы ни в одном из плавающих типов (float, double, long double).
И компилятор, и процессор вольны привнести туда ряд ошибок, причём как вниз, так и вверх.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[4]: 0.8*10=?
От: NikeByNike Россия  
Дата: 17.07.07 15:27
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Что же касается 0.1, 0.7, 0.8 — они непредставимы ни в одном из плавающих типов (float, double, long double).

К>И компилятор, и процессор вольны привнести туда ряд ошибок, причём как вниз, так и вверх.

посему, по хорошему, нужно запретить преобразование float'ов в int с помощью cast'ов и использовать floor, ceil и round (возможно свои).
Нужно разобрать угил.
Re[2]: Сэм-восем...
От: vadimcher  
Дата: 17.07.07 16:01
Оценка:
Здравствуйте, Erop, Вы писали:

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


V>>Сколько будет (int)( (0.1+0.7)*10 )?


E>Да моли что буедт!

E>7 скорее всего, а если очень повезёт, то 8

Как ни странно, это абсолютно правильный ответ.
Более того, что более неточный тип используется для 0.1 и для 0.7, тем скорее мы получим точный ответ 8. Я так думаю.

А вот зайца кому, зайца-выбегайца?!
Re[4]: 0.8*10=?
От: vadimcher  
Дата: 17.07.07 16:06
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, <Аноним>, Вы писали:


А>>7 будет.

А>>т/к компилятор как правило получает значения вещественных чисел приблизительно в диапазоне
А>>например 6.0 * 8.0
А>>будет как 47.999999993. когда мы выделяем целую часть получается понятно что

К>А вот тут-то мы вас и поправим!

К>Оба числа, 6.0 и 8.0 представимы во float, поэтому ошибки представления не возникает. Далее, результат умножения не вылез из мантиссы, поэтому ошибки нормализации снова не возникает. Так что получаем чистые 48.0, округляемые вниз до 48

К>Что же касается 0.1, 0.7, 0.8 — они непредставимы ни в одном из плавающих типов (float, double, long double).

К>И компилятор, и процессор вольны привнести туда ряд ошибок, причём как вниз, так и вверх.

А вот интересный вопрос, насколько это зависит от компилятора/процессора?

А вот зайца кому, зайца-выбегайца?!
Re: 0.8*10=?
От: Arm.Turbo http://zcontest.ru
Дата: 23.07.07 09:55
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Этюд-не этюд, но по крайней мере полезное упражнение.


V>Сколько будет (int)( (0.1+0.7)*10 )?


Надо так: (int)((0.1+0.7)*10 + 0.5) для верности. =)
Re[2]: 0.8*10=?
От: Ravlyk Австралия http://stitcharteasy.com
Дата: 23.07.07 11:24
Оценка:
Здравствуйте, Arm.Turbo, Вы писали:

V>>Сколько будет (int)( (0.1+0.7)*10 )?

AT>Надо так: (int)((0.1+0.7)*10 + 0.5) для верности. =)

Я всегда так делаю. Но работает это только для положительных чисел. Для отрицательных нужно отнимать 0.5
Re[3]: Сэм-восем...
От: Кодт Россия  
Дата: 25.07.07 17:43
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Более того, что более неточный тип используется для 0.1 и для 0.7, тем скорее мы получим точный ответ 8. Я так думаю.


А вот тут надо смотреть на период двоичной дроби 1/5 и на разрядность мантиссы. И на то, что там окажется в младшем разряде.
В общем, это лотерея.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.