Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187

Функция atof странно преабразует char* to double

21.03.2021, 17:14. Показов 1588. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветики.

Есть массив типа char *. Мне нужно переложить в тип double
Вот что получается на выходе
printf("%s" -> %.10f", arr[i], atof(arr[i]) );


"57006.75000000" -> 57006.7500000000
"57001.67000000" -> 57001.6699999999
"57001.67000000" -> 57001.6699999999
"57003.31000000" -> 57003.3099999999
"57008.46000000" -> 57008.4599999999
"57013.23000000" -> 57013.2300000000
"57013.23000000" -> 57013.2300000000
"57013.23000000" -> 57013.2300000000
"57010.46000000" -> 57010.4599999999
"57008.93000000" -> 57008.9300000000
"57003.45000000" -> 57003.4499999999
"57000.00000000" -> 57000.0000000000
"57000.00000000" -> 57000.0000000000


Я сперва думала что это из-за форматирвания printf, но поймала момент,
где я вручную кладу цифру в double = 57003.45000000 она потом может быть != atof(arr[i]). где arr[i] это char "57003.45000000"

на двух компиляторах так
gcc version 8.3.1 20190311 (Red Hat 8.3.1-3) (GCC)
и
Apple LLVM version 10.0.0 (clang-1000.10.44.4)


Почему такое поведение ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2021, 17:14
Ответы с готовыми решениями:

Преобразование char* в double (функции atof и strtod)
Добрый вечер и с праздником!!! Возник вопрос с функциями atof и strtod. А точнее проблемы с округлением (пример: вводим с консоли...

Из String в Double без atof
Здравствуйте. Задача: перевести последовательность цифр и знаков "-", "." и "e" из формата строки в формат числа double. Однако...

atof возвращает int вместо double
Здравствуйте. Почему atof возвращает целое число? При попытке ввести 0.1 возвращает 0 int main() { double a; a...

13
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
21.03.2021, 17:19
Цитата Сообщение от helena_1990 Посмотреть сообщение
C++
1
printf("%s" -> %.10f", arr[i], atof(arr[i]) );
- кавычка после s лишняя.

Добавлено через 1 минуту
Так а что не нравится-то? То что оно разбивается?
0
Заблокирован
21.03.2021, 17:29
Ее пугает потеря точности.

Добавлено через 2 минуты
Цитата Сообщение от helena_1990 Посмотреть сообщение
Почему такое поведение ?
https://www.cyberforum.ru/blogs/18334/blog88.html

Добавлено через 5 минут
Как сравнивать числа на равенство с плавающей точкой.
Проблема сравнения чисел с плавающей точкой
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
21.03.2021, 17:55  [ТС]
Цитата Сообщение от FFPowerMan Посмотреть сообщение
- кавычка после s лишняя.
Я её случайно поставила когда тут вводила, в коде её разумеется нет.

Добавлено через 1 минуту
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Так а что не нравится-то? То что оно разбивается?
Не нравится хотя бы то, что 57001.67000000 != 57001.6699999999
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
21.03.2021, 18:00
Это дробные числа(float, double) - неточные. То что оно разбивается связано с их хранением в памяти. Вам дали ссылки - читайте. Или можно в Интернете глянуть тоже самое.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
21.03.2021, 18:12  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Как сравнивать числа на равенство с плавающей точкой.
Спасибо, почитаю.

Добавлено через 2 минуты
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Это дробные числа(float, double) - неточные.
просто очень странно видеть такое )

"57008.46000000" -> 57008.4599999999
"57013.23000000" -> 57013.2300000000
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
21.03.2021, 18:20
Первый раз странно.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
21.03.2021, 18:47  [ТС]
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Первый раз странно.
Я сделала проще, написала функцию
C++
1
2
3
4
void adjust_to_step(double &value, const double step) {
   const double a = value;
   value = long(a/step)*step;
}
Мне нужен шаг например 0.01 следовательно adjust_to_step(double, 0.01) я получаю 12345678.1200000000 и вывод нормальный.
0
Заблокирован
21.03.2021, 19:05
helena_1990, думаете это спасет при сравнении на равенство ? ))

Добавлено через 1 минуту
Цитата Сообщение от helena_1990 Посмотреть сообщение
и вывод нормальный.
вывод не показывает всю точность, только стандартную, вполне возможно округленную.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
21.03.2021, 19:05  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
думаете это спасет при сравнении на равенство ? ))
Попробуйте
0
Заблокирован
21.03.2021, 19:26
helena_1990, то что вы делаете переливаете с пустого в порожнее.
делая другую погрешность, а то что Вам показывает вывод, просто решает, когда округлять, когда нет.
Цитата Сообщение от helena_1990 Посмотреть сообщение
Попробуйте
пример у меня неудачный, но сути это не меняет
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
21.03.2021, 19:31  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
не равно
сделайте в вашем коде
double adjust=(double)3/4 или double adjust=3./4.
)

Добавлено через 3 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
но сути это не меняет
Вы точно уловили суть этой строки ? value = long(a/step)*step;
0
Заблокирован
21.03.2021, 19:46
больше чем потому и уверен что это бред
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <iomanip>
double adjust_to_step(const double value, const double step) {
   double res;
   res = long(value/step)*step;
   return res;
}
int main()
{
 
    std::cout << adjust_to_step(100500.55, 0.01) << std::endl;
    std::cout << adjust_to_step(100500.25, 0.01) << std::endl;
  
}
100501
100500

Добавлено через 2 минуты
helena_1990, мне искренне жаль , разбирайтесь, мне дальше не интересно.
0
 Аватар для Helen_2001
15 / 13 / 4
Регистрация: 23.08.2017
Сообщений: 187
21.03.2021, 19:47  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
больше чем потому и уверен что это бред
Вы конечно меня простите, но вы уже 4 или 5 своих сообщения удалили где наделали простые ошибки в коде.
А суть так и не уловили, увы и хорошего Вам вечера
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.03.2021, 19:47
Помогаю со студенческими работами здесь

Делегат Func<Action<char>, bool, double, double>
Задание: реализуйте пользовательский тип делегата требуемой сигнатуры и выполните с его использованием вызов нескольких методов (с...

Русский шрифт и функция atof()
Привет всем! Подскажите, как правильно в программах на С++ делать вывод русского шрифта в консоль. Я пишу такую строку: ...

Функция atof() возвращает не точное значения
Добрый день подскажите может кто знает есть программа в MFC фрагмент кода void Ce_weightDlg::OnBnClickedButton1() // зважування { ...

Функция atof - превод строки в float тип
Проблема такая: получаю по СОМ порту строчку типа '-123.345' ее нужно перевести в float тиа. Использую функцию atof. Компилируется и...

Функция insert char to dynamic char array работает не во всех случаях
В порядке изобретения велосипедов написал функцию, но она вставляет значение в массив, если индекс его вставки меньше, чем длина массива....


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru