![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
jimbo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
Привет всем. как преобразовать число из типа double в тип int.
Windows Vista SP2, MSVS 2008 SP1 Вот такой код не работает на моем компе. если делать округление функцией ceil то все нормально переводится.
Вопрос наверно такой: как определить когда надо использовать округление а когда не надо? Это сообщение отредактировал(а) jimbo - 24.2.2011, 14:47 --------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
|||
|
||||
Modul |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 17.2.2006 Репутация: нет Всего: нет |
А Вы сами напишите, что думаете. А сообщество подскажет дальше...
--------------------
I'll be back ! |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а как именно не работает - это, наверно военная тайна.. зависит от задачи, которую Вы забыли сформулировать.. |
|||
|
||||
jimbo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
Ну почему же? не тайна. я запускал этот код на своем компе и на соседнем, там стоит хр. всегда результат был таким: 3.000000,2 Математическое выражение (0.9888 - 0.9885) * 10^4 = 0.0003 * 10000 = 3 в типе double это число получается 2,9999999999999 с приведением к типу int получается 2. Ну не логично же, нет? Вопрос из сабжа. как преобразовать тип double в int "по-человечески" ? --------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
jimbo, запусти вот это
и, думаю, будет всё понятно Это сообщение отредактировал(а) borisbn - 24.2.2011, 16:29 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это не преобразование, а округление.. стандартной функции round нет.. гугль поможет найти библиотечку, где такая есть.. если хотите самостоятельно реализовать, то правила простые :
http://en.wikipedia.org/wiki/IEEE_754-2008 |
|||
|
||||
jimbo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
запустил.
на все вопросы он мне не ответил. Тут одинаковый код только цифры разные. У меня на компе ii = 3 а с = 2. У вас не так? Запустите и посмотрите. ВСЕГДА должно быть 3 - это чисто математически верно, нет других вариантов. Компьютер же считает иначе. я так полагаю из-за хранения типа double, получается неточность, в итоге инт у нас равен 2. Потом по коду я перевожу дабл в строку и строку в инт. результат ошеломляющий и блин верный. дубль два - как по-человечески перевести тип дабл в инт. Есть ли возможность задать типу дабл точность до 10 знаков после запятой или как-то избегать ответов "no" в коде. Считайте что числа `p` и `sl` всегда разные.
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
|||
|
||||
mes |
|
||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
из за способа округления.. стандартных только два :
http://www.cplusplus.com/reference/clibrary/cmath/floor/
http://www.cplusplus.com/reference/clibrary/cmath/ceil/ оба они Вам не подходят..
|
||||||||
|
|||||||||
jimbo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
я реализовал через строки. Но боже мой, какой тупизм!!
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
действительно, не лучшее решение точнее не int, а результат Вашего округления (читай отбрасывания дробной части). если преобразовывать так
то будет правильное округление и еще, написав, double p = 0.9888; Вы не получите десятичное число 0.9888 в переменной p. отсюда, скорее всего, и вопросы. jimbo, объясните суть задачи, и Вам, скорее всего, помогут её решить... Это сообщение отредактировал(а) borisbn - 24.2.2011, 18:08 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для отрицательных тоже ? ![]() Добавлено через 2 минуты и 10 секунд имхо, Вам проще всего будет реализовать на основе modf Добавлено через 3 минуты и 6 секунд или доработать приведенное borisbn.. |
|||
|
||||
jimbo |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
Задача сводится к преобразованию числа типа double к числу типа int. Причем не так как делает это компилятор (отбрасыванием дробной части) а математически. Разряд максимальный после запятой - 10. То есть не надо супер приближений
Есть объект у которого есть метрика value. Она вещественная. Есть меняющийся стандарт. у него также есть метрика st_value. Есть минимальное отклонение st. Есть порог чувствительности level. В течение времени можно создать много много объектов и у каждого будет своя value. Когда у какого-либо объекта метрика приближается к текущему стандату ближе чем порог чувствительности level необходимо обработать данные. Теперь смотрим. есть объект с value 0.9888. Текущий стандарт 0.9885. Порог чувствительности 3 минимальных отклонения. Минимальное отклонение 0.0001 (зачастую является степенью 10). Мне надо обработать данные судя по математическим числам, программа же моя не реагирует, потому что 2 не больше 3.
Вот и получается что
Добавлено через 11 минут и 3 секунды
Или я не понял как пользоваться Modf или вот
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
теперь анализируйте дробную часть, и четность целой части (необязательно) и на основе это возвращайте правильно округленное значение.. Добавлено через 3 минуты и 48 секунд вместо 3 (целое) используйте 3.0 или просто 3. (с точкой) и не надо будет округлять.. |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
быстрее (ответить в форум) - не значит правильнее ![]() ![]() ![]()
2 jimbo, IMHO так должно работать
Это сообщение отредактировал(а) borisbn - 24.2.2011, 22:18 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
А преобразовывать именно double в int для сравнения (а не наоборот) религия требует? ![]()
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |