Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
VIKT0R
9 / 9 / 2
Регистрация: 15.11.2011
Сообщений: 101
#1

Непонятное поведение sscanf(.., "%lf", ..) - C++

15.11.2011, 16:56. Просмотров 1992. Ответов 10
Метки нет (Все метки)

Здравствуйте все!

Столкнулся с такой проблемой: читаю строку из трех вещественных чисел - 18.4, 5.05, 1.015; смотрю значение value[0] - а там вместо 18.4 - 18.399999999....
Подскажите пожалуйста, почему это происходит, можно ли с этим бороться, и, если можно, то каким образом?



double value[3];

sscanf(str, "TEXT %lf, %lf, %lf", &value[0], &value[1], &value[2]);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2011, 16:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятное поведение sscanf(.., "%lf", ..) (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс "вентилятор" содержащий в себе классы:...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

10
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.11.2011, 18:03 #2
Цитата Сообщение от VIKT0R Посмотреть сообщение
смотрю значение value[0] - а там вместо 18.4 - 18.399999999
где/как смотришь?
http://liveworkspace.org/code/0990dd81237019e20f771f099eaa9153
0
Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
15.11.2011, 18:13 #3
C
1
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]);
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
15.11.2011, 18:28 #4
Цитата Сообщение от VIKT0R Посмотреть сообщение
18.4 - 18.399999999....
Видимо, секрет открою: 18.4 и 18.3(9) - фактически одно и то же число.
0
VIKT0R
9 / 9 / 2
Регистрация: 15.11.2011
Сообщений: 101
16.11.2011, 08:29  [ТС] #5
где/как смотришь?
смотрю в отладчике MSVS2008

Nursik77, спасибо, попробую:
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]);
easybudda, не понял:
Видимо, секрет открою: 18.4 и 18.3(9) - фактически одно и то же число.
Дело в том, что дальше в программе из-за этой 0.00000000001 функция acos получает недопустимый аргумент в виде 1.00000000001
0
verena-12358
1 / 1 / 0
Регистрация: 12.10.2011
Сообщений: 165
16.11.2011, 11:17 #6
нужно сделать так sscanf(str, "TEXT %2.1lf, %l2.1f, %2.1lf", &value[0], &value[1], &value[2]);
0
VIKT0R
9 / 9 / 2
Регистрация: 15.11.2011
Сообщений: 101
18.11.2011, 08:10  [ТС] #7
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]); -
- не работает. В "Полном справочнике по C" Герберта Шилдта в описании функции scanf говорится о ширине сканируемого поля только применительно к строковым переменным.
0
accept
4828 / 3249 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
18.11.2011, 10:45 #8
Цитата Сообщение от Nursik77
C
1
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]);
у scanf() нет понятия точности в спецификаторе
есть запрет сохранения, ширина поля и модификатор длины
0
VIKT0R
9 / 9 / 2
Регистрация: 15.11.2011
Сообщений: 101
18.11.2011, 11:49  [ТС] #9
Хотелось бы понимать, так сказать, "физику процесса"; откуда набегает эта погрешность?
И, я так понимаю, мне придется либо какую-то свою функцию городить, либо что-то придумывать с результатами scanf...
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
18.11.2011, 13:04 #10
Цитата Сообщение от VIKT0R Посмотреть сообщение
Хотелось бы понимать, так сказать, "физику процесса"; откуда набегает эта погрешность?
Как наверное тебе известно, числа в компьютере хранятся в двоичном виде. С представлением целых чисел проблем нет, а вот с дробными не все так посто - не всякое дробное число можно представить конечным количеством бит. К таким числам относится и 0.4, в двоичном виде оно будет представлять собой периодическую дробь 0.(0110). И естественно, все число не может быть представлено в памяти компьютера, все что не помещается будет просто отброшенно. На примере типа double, для хранения мантиссы отводится 52 бита, у нас есть число 18.4, целая часть займет 4 бита, для дробной части останется 48 бит. Если мы теперь переведем в десятичную систему первы 48 разрядов дроби 0.(0110), то получим как раз 0.3(9).
1
VIKT0R
9 / 9 / 2
Регистрация: 15.11.2011
Сообщений: 101
18.11.2011, 13:14  [ТС] #11
kazak, спасибо, понял!
0
18.11.2011, 13:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2011, 13:14
Привет! Вот еще темы с ответами:

"Неопределенное поведение" при выходе вводимых данных за пределы массива - C++
В условии задачи написано, что функция не проверяет индексы. И если введенные пользователем входные данные будут выходить за пределы...

Необычное поведение или "Купи слона" - C++
Написал простенькую программку на С++, которая настойчиво просит купить слона, пока не получит ответ "ok", "fine" или "yes". #include...

Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" - C++
Функция - расчёт зарплаты по нагрузке и оплате часа для определенной категории. Категория Оплата часа Вторая 150 Первая 200 ...

Создать иерархию классов "Фирма", "Бухгалтер", "Сотрудник", "Зарплата" - C++
Само по себе понятие "зарплата" не особенно конкретное: оно включает и почасовую, и ставочную зарплату, и комиссионные, и процент с продаж....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.