9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
1

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

15.11.2011, 16:56. Показов 2345. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2011, 16:56
Ответы с готовыми решениями:

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

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

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

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

10
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.11.2011, 18:03 2
Цитата Сообщение от VIKT0R Посмотреть сообщение
смотрю значение value[0] - а там вместо 18.4 - 18.399999999
где/как смотришь?
http://liveworkspace.org/code/... 099eaa9153
0
В вечном поиске...
275 / 235 / 30
Регистрация: 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11161 / 7097 / 1677
Регистрация: 25.07.2009
Сообщений: 12,984
15.11.2011, 18:28 4
Цитата Сообщение от VIKT0R Посмотреть сообщение
18.4 - 18.399999999....
Видимо, секрет открою: 18.4 и 18.3(9) - фактически одно и то же число.
0
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
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
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
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
18.11.2011, 08:10  [ТС] 7
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]); -
- не работает. В "Полном справочнике по C" Герберта Шилдта в описании функции scanf говорится о ширине сканируемого поля только применительно к строковым переменным.
0
4860 / 3282 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.11.2011, 10:45 8
Цитата Сообщение от Nursik77
C
1
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]);
у scanf() нет понятия точности в спецификаторе
есть запрет сохранения, ширина поля и модификатор длины
0
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
18.11.2011, 11:49  [ТС] 9
Хотелось бы понимать, так сказать, "физику процесса"; откуда набегает эта погрешность?
И, я так понимаю, мне придется либо какую-то свою функцию городить, либо что-то придумывать с результатами scanf...
0
3087 / 2408 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
18.11.2011, 13:04 10
Цитата Сообщение от VIKT0R Посмотреть сообщение
Хотелось бы понимать, так сказать, "физику процесса"; откуда набегает эта погрешность?
Как наверное тебе известно, числа в компьютере хранятся в двоичном виде. С представлением целых чисел проблем нет, а вот с дробными не все так посто - не всякое дробное число можно представить конечным количеством бит. К таким числам относится и 0.4, в двоичном виде оно будет представлять собой периодическую дробь 0.(0110). И естественно, все число не может быть представлено в памяти компьютера, все что не помещается будет просто отброшенно. На примере типа double, для хранения мантиссы отводится 52 бита, у нас есть число 18.4, целая часть займет 4 бита, для дробной части останется 48 бит. Если мы теперь переведем в десятичную систему первы 48 разрядов дроби 0.(0110), то получим как раз 0.3(9).
1
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
18.11.2011, 13:14  [ТС] 11
kazak, спасибо, понял!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2011, 13:14
Помогаю со студенческими работами здесь

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

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

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

Связать отношением наследования классы "Место", "Область", "Город", "Мегаполис"
Для определения иерархии классов связать отношением наследования классы, приведенные в приложении...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru