Проблема округления или что?
|
|
Seqular | Дата: Понедельник, 17.11.2008, 23:12 | Сообщение # 1 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Решал такую вот задачку.. Нужно найти округленный снизу логарифм по основанию 2 от числа X. Ну преобразовал его в: Code log_low := lg(x)/lg(2); Ну оно разумеется типа Real. Ввожу 512 в качестве аргумента. Все верно, выдает 9.0000000000. Пытаюсь откинуть дробную часть. Делаю Trunc(X) или Int(X) - одинаково, оставляет 8-рку... Это мне не подходит! Должна оставаться девятка. Как добиться? При всем при том, чтобы целая часть только в качестве ответа была (потому простое округление не подходит), например для числа 1023 должна быть та же самая 9-ка, а для 1024 - 10-ка уже
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Alexander | Дата: Вторник, 18.11.2008, 00:51 | Сообщение # 2 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote (Seqular) Все верно, выдает 9.0000000000. Уже с округлением выдаёт. Проверять нужно так: writeln(frac(log_low)); И выхода тут нет, машинное эпсилон однако... Придётся в ручную функцию писать, где проверить не является ли x степенью двойки.
Скажем дружно- нафиг нужно!
|
|
| |
Seqular | Дата: Вторник, 18.11.2008, 06:11 | Сообщение # 3 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Alexander, Да, я так и проверил. Выдает дробную часть как 0.99999999996. Вот... А насчет проверки - у меня другая идея возникла. Погляди... Функция log_low от аргумента 512 ~= 8.999999999. От 513 ~= 9.0006. Т.е. точность знака до 5-го... Можно просто проверить, если меньше определенного порога, то сделать Round, а если больше, то Int :). Кстати, какого хрена Int(Х) возвращает Real? :() в чем суть ее тогда?
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Alexander | Дата: Вторник, 18.11.2008, 06:25 | Сообщение # 4 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote (Seqular) Т.е. точность знака до 5-го... Можно просто проверить, если меньше определенного порога, то сделать Round, а если больше, то Int :). trunc, а не инт. Это называется "чтоб работало" . Quote (Seqular) Кстати, какого хрена Int(Х) возвращает Real? :() в чем суть ее тогда? Обнуляет мантиссу. Нужен ЛонгИнт- используй trunc.
Скажем дружно- нафиг нужно!
|
|
| |
Seqular | Дата: Вторник, 18.11.2008, 06:42 | Сообщение # 5 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Quote (Alexander) Это называется "чтоб работало" . Ну правда... В демо-задаче навряд-ли будут использоваться числа выше 16384, а это 14-ая степень.. Теперь, если взять 16383, получим 13,9999119, т.е. на 5-ой позиции после зпт. Ммм.. Можно взять точность E=0.00001 и каким-либо образом проверить дробную часть. Если она меньше точности в меньушю сторону или больше 1-E в большую, то нафига транкать число? Округлим и дело с концом :))) Ну правильно я думаю или нет? Quote (Alexander) Обнуляет мантиссу Понятно. Спасибо
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Alexander | Дата: Вторник, 18.11.2008, 23:02 | Сообщение # 6 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote (Seqular) Ну правильно я думаю или нет? Если надо только, чтоб работало- то прокатит . Точность можно смело 9 знаков брать.
Скажем дружно- нафиг нужно!
|
|
| |
Seqular | Дата: Среда, 19.11.2008, 06:24 | Сообщение # 7 |
Хранитель
Группа: Администраторы
Сообщений: 859
Статус: Offline
| Quote (Alexander) Точность можно смело 9 знаков брать Да не знаю, какие числа нужно брать, чтобы ошибка до 9-го знака добралась... Ориентировочно - степень 30-40ая.. А это уже за Integer. Но сделал с точностью, сработало
Поддерживаю также проект сообщество молодых сисадминов
|
|
| |
Alexander | Дата: Среда, 19.11.2008, 07:02 | Сообщение # 8 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote (Seqular) Да не знаю, какие числа нужно брать, чтобы ошибка до 9-го знака добралась... Это точность 9 знаков, а ошибка 1 или 2.
Скажем дружно- нафиг нужно!
|
|
| |