0 / 0 / 1
Регистрация: 24.04.2013
Сообщений: 8
|
|
1 | |
Ошибка при изменении типа данных24.04.2013, 16:06. Показов 720. Ответов 8
Метки нет Все метки)
(
Добрый день.
Возникла следующая задача. Я бы даже сказал загадка. В программе использовал (int) - операцию перевода числа из типа с плавающей точкой в тип целого числа. В ходе тестирования оказалось, что выражение: (int)(2.3 * 100) дает ответ 229, а не 230 как по моему мнению должно было бы быть. При этом так же не правильные ответы дают выражения с константами (2.32, 2.28, 2.26). Во всех остальных случаях (из тех которые я тестировал) ответы были правильные, то есть соответствовали моему представлению. (int)(2.2 * 100) == 220 (int)(2.4 * 100) == 240 (int)(20.3 * 100) == 2030 и т.д. Если у кого нибудь есть этому объяснение буду признателен.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
24.04.2013, 16:06 | |
Ответы с готовыми решениями:
8
Ошибка при изменении данных
|
115 / 115 / 8
Регистрация: 12.04.2013
Сообщений: 379
|
|
24.04.2013, 16:43 | 2 |
Это связано с представлением числа с плавающей запятой в памяти компьютера - оно далеко не точное.
по этой же причие следующая конструкция приведед к зацикливанию Код
double t = 10; while (t != 0) t = t - 0.1;
1
|
0 / 0 / 1
Регистрация: 24.04.2013
Сообщений: 8
|
||||||
24.04.2013, 17:17 [ТС] | 3 | |||||
Получается что вычислениям значений с плавающей точкой вообще нельзя доверять?
Не радует такое положение вещей. И все же, вспоминая теорию: у всех типов чисел с плавающей точкой есть так называемая разрядность. float 7-8 double 15-16 long double 19-20 И насколько я знаю под разрядностью как раз понимают то количество знаков в числе с плавающей точкой которым можно доверять. Реальность же это опровергает. И какой из этого выход? Я имею ввиду что существую задачи, например математические, когда точность решения критична.
0
|
115 / 115 / 8
Регистрация: 12.04.2013
Сообщений: 379
|
|
24.04.2013, 17:21 | 4 |
0
|
0 / 0 / 1
Регистрация: 24.04.2013
Сообщений: 8
|
|
24.04.2013, 21:45 [ТС] | 5 |
Ошибка получается при попытке перевести из одного типа данных в другой. При чем с помощью специально предназначенной для этого операции.
0
|
115 / 115 / 8
Регистрация: 12.04.2013
Сообщений: 379
|
|
24.04.2013, 21:53 | 6 |
ну так вы результат тогда преобразовывайте, то есть сначала в переменную посчитайте, а потом преобразуйте.
0
|
0 / 0 / 1
Регистрация: 24.04.2013
Сообщений: 8
|
||||||||||||||||||||||||||
24.04.2013, 22:24 [ТС] | 7 | |||||||||||||||||||||||||
Вот в этом то вся и загвоздка.
Переменная которая получает свое значение вводом с клавиатуры или присваиванием конкретного числа в ходе программы, преобразуется без ошибок.
Добавлено через 12 минут Я объясню для чего у меня возникла такая необходимость. Цель число с плавающей точкой (с двумя знаками после точки) разделить на два числа: на то что до точки и на то что после. И присвоить их переменным целого типа. То есть если переменная double x == 2.35, то должно получить две переменные int y == 2, z == 35. Для того чтобы выделить дробную чать я сначала x * 100 - то есть смещал запятую на две цифры вправо. Потом переводил в int - тоесть оставлял только целую часть. И в конец получал остаток от деления на 100 - то есть снова отделял эти две цифры.
0
|
115 / 115 / 8
Регистрация: 12.04.2013
Сообщений: 379
|
|
24.04.2013, 22:33 | 8 |
Код
double t; t = 2.3 * 100; t = rint(t); printf ("%d\n", (int)t)
1
|
0 / 0 / 1
Регистрация: 24.04.2013
Сообщений: 8
|
||||||
25.04.2013, 12:48 [ТС] | 9 | |||||
Идея понятна. Спасибо.
Единственный момент что функция rint поддерживается стандартом C99. Я компилирую в Microsoft Visual C++ 2010 Express. Он ее не понимает. Поэтому для стандарта 89 г. такое решения не подойдет. Вообще самый оптимальный вариант это организовать ввод как два целых числа разделенных точкой.
double ceil (double x); -наименьшее приведенное к double целое >=x; double floor (double x); -наибольшее приведенное к double целое <=x.
0
|
25.04.2013, 12:48 | |
Помогаю со студенческими работами здесь
9
Ошибка при изменении данных и попытке сохранения в программе Ошибка при изменении данных через Entity Framework Ошибка при выборе типа данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |