Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fscanf & float, странноватые значения читает 
V
    Опции темы
Kefir
Дата 11.10.2006, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Есть мега-сложная программа, вот её полный код:
Код

#include <stdio.h>

int main() {
    FILE *pFile = fopen("floats.txt", "r");
    float f;
    fscanf(pFile, "%f", &f);
    fclose(pFile);
    printf("%f\n", f);
    return 0;
}

Мега-большой файл floats.txt:
Цитата

12345.13

В результате программа мне выдаёт замечательное число:
Цитата

12345.129883

собственно говоря вопрос - где суть?! Почему такое странное число получается? Компилировал на g++ и Visual C++ 6.0 - результат один и тот же.
PM MAIL WWW Skype   Вверх
chaos
Дата 11.10.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



так лечиться smile

Код

printf("%7.2f\n", f);

PM WWW   Вверх
Kefir
Дата 11.10.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Если не сложно - объясни мне глупцу, почему так происходит? почему 7.2f (а не 9.4f или 12.84f)? Или дай, пожалуйста, ссылку на то, где об этом можно почитать (почему-то я из манов по scanf/fscanf этого не нашёл).
PM MAIL WWW Skype   Вверх
chaos
Дата 11.10.2006, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Kefir, printf
PM WWW   Вверх
Kefir
Дата 11.10.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



и ещё - мне же надо всякие опрации с такими числами делать (конкретно - надо считать 12 float'ов и поизеваться над ними). Но с такими странными значениями никакой точности же нет! Как сделать так чтобы переменные реально содержали, например 12345.1200000?? 
PM MAIL WWW Skype   Вверх
Romikgy
Дата 11.10.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Kefir @  11.10.2006,  07:36 Найти цитируемый пост)
собственно говоря вопрос - где суть?! Почему такое странное число получается? 

таково представление чисел с плавающей точкой в двоичном коде

Добавлено @ 09:22 
Kefir, заюзай double
Код

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
        FILE *pFile = fopen("c:\\float.txt", "r");
    //float
    double f;
    char sx[255];
    fscanf(pFile, "%s", &sx[0]);
    fclose(pFile);
    f=atof(sx);
    printf("%.2f\n", f);
     getchar();
        return 0;
}



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Kefir
Дата 11.10.2006, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Romikgy, ок. вроде помогло... а вообще, странно всё это... приходится изобретать workaround'ы вместо того, что юзать стандартную функцию...
PM MAIL WWW Skype   Вверх
Romikgy
Дата 11.10.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Kefir @  11.10.2006,  08:30 Найти цитируемый пост)
workaround

что есть это ?
имхо 
Цитата(Kefir @  11.10.2006,  08:30 Найти цитируемый пост)
стандартную функцию

страдают малой точностью , хотя и не все 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Kefir
Дата 11.10.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Цитата(Romikgy @  11.10.2006,  09:38 Найти цитируемый пост)
что есть это ?

это "через попу к солнцу" - решение проблемы (нестандартными методами), возникшей из-за неправильного действия функции предназначенной для выполнения требуемой операции. 
PM MAIL WWW Skype   Вверх
Romikgy
Дата 11.10.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Kefir @  11.10.2006,  08:42 Найти цитируемый пост)
это "через попу к солнцу" - решение проблемы (нестандартными методами), возникшей из-за неправильного действия функции предназначенной для выполнения требуемой операции.  

круто завернул smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Earnest
Дата 11.10.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



кто мешает читать в double scanf? Просто добавть к формату модификатор l:
Код

double f; 
fscanf(pFile, "%lf", &f);

И, действительно, не используй float - там точность малая...


--------------------
...
PM   Вверх
Romikgy
Дата 11.10.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Earnest @  11.10.2006,  09:46 Найти цитируемый пост)
fscanf(pFile, "%lf", &f);

у мя такое ошибку дало smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Kefir
Дата 11.10.2006, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



Earnest, чёрт.... тут Kefir понял насколько он несообразителен...

Добавлено @ 11:17 
Кстати, тема закрыта   smile Надо просто в даблы читать.
PM MAIL WWW Skype   Вверх
Мяут
Дата 11.10.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



ничего, что в закрытую тему?  smile 

Kefir, вещественные типы в C/C++ не обеспечивают абсолютной точности и дело вовсе не в printf или scanf, а в особенностях представления чисел в компьютере. Поэтому реальное значение лежит в пределах:
r = f+-std::numeric_limits<float>::epsilon();
С double такая же проблема.

К тому же возможны ошибки при сравнении. Потому сравнивать вещественные числа нужно через разность:
Код

if((fa-fb)<std::numeric_limits<float>::epsilon()) ...


Удачи!

Это сообщение отредактировал(а) Мяут - 11.10.2006, 12:43
PM MAIL   Вверх
Romikgy
Дата 11.10.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Мяут @  11.10.2006,  11:42 Найти цитируемый пост)
особенностях представления чисел в компьютере.

 smile 
Цитата(Romikgy @  11.10.2006,  08:08 Найти цитируемый пост)
таково представление чисел с плавающей точкой в двоичном коде

 smile  smile  smile  smile  smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.