Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115

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

15.11.2011, 16:56. Показов 2730. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2011, 16:56
Ответы с готовыми решениями:

Непонятное поведение
Всем привет! В книге "Прата - Язык программирования C++. Лекции и управжения 2011" нашёл вот такой пример: const free_throws...

Непонятное поведение функции
Есть некоторый метод класса: int mustAttack(Chess &chess, Player& p1, Player& p2, int atackerName, int chessid) { if (chess.alive)...

Непонятное поведение функтора
Почему-то не считается произведение 1 и 6 ... #include <iostream> #include <algorithm> #include <functional> #include...

10
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
15.11.2011, 18:03
Цитата Сообщение от VIKT0R Посмотреть сообщение
смотрю значение value[0] - а там вместо 18.4 - 18.399999999
где/как смотришь?
http://liveworkspace.org/code/... 099eaa9153
0
В вечном поиске...
 Аватар для Nursik77
275 / 235 / 30
Регистрация: 05.04.2011
Сообщений: 645
15.11.2011, 18:13
C
1
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]);
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
15.11.2011, 18:28
Цитата Сообщение от VIKT0R Посмотреть сообщение
18.4 - 18.399999999....
Видимо, секрет открою: 18.4 и 18.3(9) - фактически одно и то же число.
0
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
16.11.2011, 08:29  [ТС]
где/как смотришь?
смотрю в отладчике 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
нужно сделать так 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  [ТС]
sscanf(str, "TEXT %.1lf, %.1lf, %.1lf", &value[0], &value[1], &value[2]); -
- не работает. В "Полном справочнике по C" Герберта Шилдта в описании функции scanf говорится о ширине сканируемого поля только применительно к строковым переменным.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
18.11.2011, 10:45
Цитата Сообщение от 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  [ТС]
Хотелось бы понимать, так сказать, "физику процесса"; откуда набегает эта погрешность?
И, я так понимаю, мне придется либо какую-то свою функцию городить, либо что-то придумывать с результатами scanf...
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
18.11.2011, 13:04
Цитата Сообщение от 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  [ТС]
kazak, спасибо, понял!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2011, 13:14
Помогаю со студенческими работами здесь

Непонятное поведение операции %
Добрый вечер! Выполняю лабораторную работу. Необходимо реализовать функции шифровки и дешифровки методом Вернама. В функции шифрования все...

Непонятное поведение программы
Пишу статическую либу. В ней есть кусок кода, который уходит в рекурсию.. Только причины мне непонятны.. Вот кусок кода std::string...

Непонятное поведение программы
Доброго времени суток. Уважаемые форумчане, очень нуждаюсь в вашей консультации насчёт своей программы. Я не стану освещать задачу, которую...

Непонятное поведение программы
Привет народ, вот кароч: #include"stdafx.h" #include"iostream" using namespace std; class calc{ int *i, *j; public: int...

Непонятное поведение логических операторов С++
Решаю задачу из учебника Стивена Праты. Глава 6, задание 7. Условие под спойлером. Вопрос описал как можно подробнее в комментарии в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru