![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Frekenbok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 29.10.2006 Репутация: 1 Всего: 1 |
Привет всем!
Вот проблемка возникла на пустом месте... Помогите, пожалуйста. Есть у меня переменная num типа double. Мне нужно получить целую часть числа или округлить "вниз". Вроде бы для этого существует функция floor, что меня очень радовало. Но на деле оказалось, что если num=1.0, то floor(num)=0.0, а мне нужно 1.0! Был у меня и другой вариант: извлечь целую и дробную части fract=modf(num, &intnum), но в этом случае если num=1.0, то получается fract=1.0, а intnum=0.0. Почему так? Если просто выводить printf("%.0lf",num), то он сам округляет, и получается не то, что нужно. На всякий случай поясню, как получаю num, может, это имеет значение, и где-то происходят какие-то округления и обрезания (в С ведь вечно так
Для grad ввожу значения 30, 45 и др. Нужно, чтобы для num=1.0 (1.1, 1.2,...,1.8,1.9) на экран вывелось 1, для num=2.0 (2.1, 2.2,...,2.8,2.9) вывелось 2 и т.п. (надеюсь, понятно P.S.Задачка на самом деле про то, как по углу часовой стрелки определить, сколько часов и минут на часах. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
привести типы просто может?
ЗЫ: не проверял - под рукой компилятора нет. Но сколь память не изменяет... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| WERITAS |
|
|||
|
******** ![]() ![]() Профиль Группа: Участник Сообщений: 582 Регистрация: 2.5.2005 Где: Москва Репутация: нет Всего: 5 |
А другие функции округления не пробовали? round например?
-------------------- Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак" |
|||
|
||||
| ILAgent |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 1.3.2006 Репутация: нет Всего: нет |
Так можно, наверное:
|
|||
|
||||
| nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
floor() работает правильно, проблема в том, что ввиду двоичного представления чисел в компьютере num не может быть равен точно 1.0, только что-то вроде 0.9999999999954 (твой случай) или 1.000000000121, аналогично для modf() В принципе это не должно сильно мешать, но если в результате будут заметные ошибки, попробуй отлавливать такие места примерно так:
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Это сообщение отредактировал(а) Dov - 6.1.2007, 17:12 -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| Frekenbok |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 29.10.2006 Репутация: 1 Всего: 1 |
В том то и дело, что в моем древнем Борланде такой функции еще нет, поэтому и весь сыр-бор...
Так не получается. И так тоже.
Только если делать так: то вместо 1.0 мне придется подставлять как раз целую часть числа num, ведь у меня num может быть равен и 2.0, и 3.0 и т.д. И началась песня сначала... А так вообще работает, спасибо. Но это меня натолкнуло на такой вариант решения: округлить мой num до 0.000001. А для этого использую чью-то чужую умную мысль. Получилось примерно вот что:
Вот хорошо бы такие вещи просматривать в дебаггере типа ассемблерного, только как это сделать? Я подозреваю, что надо воспользоваться дизассемблером и там просмотреть ЕХЕ-шник. Вот только где взять этот дизассемблер и какой лучше? Посоветуйте что-нибудь. Или можно как-нибудь еще просмотреть ячейки памяти со значением num (причем "до" и "после", пошагово)? |
||||
|
|||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Что у тебя не получается, сказать можешь или это секрет. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| Frekenbok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 29.10.2006 Репутация: 1 Всего: 1 |
Dov, я понимаю, что выглядит все логично, взял int-ом обрезал и все. Но на практике не всегда действует. У меня Borland Turbo C++ 3.0. При значении num==1.0 (int)num получается равен 0. А все потому, что я не просто присваиваю num единицу, эта единица у меня получается в результате вычислений (см. первое сообщение), т.е. цитирую еще раз:
При использовании (int)num результат получается неверным, т.е. не тем, что мне надо. |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Borland Turbo C++ 3.0 поддерживает inline asm вставки? Тогда сделай что-то вроде этого:
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
W4FhLF, какая разница, это не от компилятора зависит, а от процессора
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Нет, тут весь топик идет речь о том, что floor(f) может быть равен 0.0, даже если f==1.0 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Ты бы для начала постарался понять, что такое вещественное число в памяти(в этом тебе поможет моя статья: http://hunger.ru/articles/num), а потом посмотрел бы, что значит команда fist, но я не буду томить и скажу тебе, что эта команда округляет в большую сторону вещественное значение и записывает его в память. Это сообщение отредактировал(а) W4FhLF - 8.1.2007, 18:54 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Спасибо, я знаю. Между прочим fist округляет не в большую сторону, а в зависимости от fps status word, но и это не поможет округлить 0.9999999999 _вниз_ (человеку надо округлять в меньшую сторону) и получить 1 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |