0 / 0 / 0
Регистрация: 11.06.2014
Сообщений: 5
|
||||||
1 | ||||||
LONG VS DOUBLE / INT VS FLOAT11.06.2014, 12:31. Показов 1691. Ответов 19
Метки нет Все метки)
(
Всем доброго времени суток!
Объясните пожалуйста почему при следующем коде
Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
11.06.2014, 12:31 | |
Ответы с готовыми решениями:
19
Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию Long float и double |
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
|
11.06.2014, 13:01 | 2 |
Это особенности поведения даблов. Суть в том, что если d = 15.99999999999 вследствие потери точности, то при выведении его как дабла, он округлится нормально, а при выведении как инта целая часть отбросится и будет 15. Приводить к целому типу лучше, прибавляя какое-нибудь небольшое число, например, 0.000000001, чтобы избежать таких потерь в точности
Добавлено через 2 минуты Вместо e = d надо сделать e = d + 0.000001. Да и static_cast<int>(b) лучше заменить на static_cast<int>(b + 0.0000001)
0
|
0 / 0 / 0
Регистрация: 11.06.2014
Сообщений: 5
|
|
11.06.2014, 13:04 [ТС] | 3 |
Я думал об этом. Но если выполнить действия
a = 196 b = 196/60=3,266667 c = 3 d = (3,266667 - 3) * 60 = 16.00002 Что больше 16. Соответсвенно, если следовать Вашей версии, то ответ должен быть 16.
0
|
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
||||||
11.06.2014, 13:17 | 4 | |||||
Вы не совсем правильно оцениваете точность операций. Дабл хранит, если не ошибаюсь, около 20 знаков после запятой, округляя только последний. При этом, в нескольких последних знаках могут быть ошибки. В частности,
15.999999999999996447
0
|
Don't worry, be happy
|
|
11.06.2014, 13:20 | 5 |
1
|
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
|
11.06.2014, 13:21 | 6 |
Согласен, был не совсем прав, но суть это не меняет, с округлением надо быть осторожнее.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
11.06.2014, 13:24 | 7 |
0
|
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
|
11.06.2014, 13:29 | 8 |
Нет же, тут цель - обрубить дробную часть, а не округлить число по правилам округления
Добавлено через 53 секунды Да и Ваш способ и для округления не годится для случая отрицательных чисел
0
|
0 / 0 / 0
Регистрация: 11.06.2014
Сообщений: 5
|
|
11.06.2014, 13:32 [ТС] | 9 |
ЭТО РАБОТАЕТ
А более надежные способы есть? Или всегда прибавлять 0.000001 и не задумываться?
0
|
2758 / 1912 / 569
Регистрация: 05.06.2014
Сообщений: 5,561
|
|
11.06.2014, 13:38 | 10 |
0
|
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
||||||
11.06.2014, 13:42 | 11 | |||||
В данном конкретном случае не работает, так как проблема была только с переменной d. Никаких более надежных способов я не знаю, кроме способа создать свою собственную функцию
Добавлено через 2 минуты Только он тоже возвращает float/double, не знаю, могут ли быть проблемы или нет, но мало ли...
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
11.06.2014, 13:45 | 12 |
По правилам округления - все что больше 0.5 округлится вверх, все что меньше вниз.
Если надо строго вверх или вниз - fllor и ceil как уже подсказали. округление по модулю пока не отменили.
0
|
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
|
11.06.2014, 13:49 | 13 |
В смысле? Как ни крути, -0.7 должно округляться до -1, если по правилам, а Вы хотите округлить до нуля, так как int(-0.2) == 0
0
|
2758 / 1912 / 569
Регистрация: 05.06.2014
Сообщений: 5,561
|
|
11.06.2014, 13:52 | 14 |
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
11.06.2014, 13:54 | 15 |
0
|
31 / 31 / 19
Регистрация: 03.05.2011
Сообщений: 84
|
|
11.06.2014, 13:59 | 16 |
Да, соглашусь. Вообще, видимо, единственные безопасные в плане точности операции с double - с целыми числами и целыми числами, поделенными на степень двойки, не очень большую
0
|
0 / 0 / 0
Регистрация: 11.06.2014
Сообщений: 5
|
||||||
11.06.2014, 16:16 [ТС] | 17 | |||||
Добавлено через 24 минуты После мозгового штурма (спасибо всем) я написал так (оставлю здесь для истории)
long double roundl (long double x); описана тут
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
11.06.2014, 17:17 | 18 |
ну т.е нужно было корректное округление до целого, которое с лохматых годов делается прибавлением 0.5 (с учетом знака, для особо пунктуальных
![]()
0
|
0 / 0 / 0
Регистрация: 11.06.2014
Сообщений: 5
|
|
11.06.2014, 22:47 [ТС] | 19 |
17 строка
e = d + 0.5 Так? а если учитывать знак то все равно придется использовать функцию (модуль)? Я правильно понял? А если придется использовать функцию, то почему бы не использовать округление до ближайшего целого? Или так памяти больше тратится или время работы увеличивается? Глупости не наговорил?
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
12.06.2014, 05:14 | 20 |
Да нормальны все решения, которые дают правильный результат. Выбор - личное дело разработчика.
0
|
12.06.2014, 05:14 | |
Помогаю со студенческими работами здесь
20
Преобразовать 2 числа int в 1 число float(double) | double int1.int2 Double, int , long double Shot int b long double Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p float double int
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |