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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Точность суммы float-ов 
:(
    Опции темы
Ares4322
Дата 7.9.2011, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

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



Доброго времени суток!
Есть отсортированный по возрастанию набор float-ов. Если их суммировать от большего к меньшему, то точность суммы будет больше, чем от меньшего к большему.
Если же делать то же самое для doublе-ов, то точность не изменяется.
Почему так происходит?
PM MAIL   Вверх
Ares4322
Дата 7.9.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

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



Немного неправильно написал условия. Приведу лучше код программы

Код


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

typedef unsigned int u32;

/*
 * 
 */
int main(int argc, char** argv) {
    u32 i=0;
    u32 limit=1000000;
    double sumDoubleForward=0;
    float sumFloatForward=0;
    double sumDoubleBackward=0;
    float sumFloatBackward=0;
    
    for(i=1; i<=limit;i++){
        sumDoubleForward = sumDoubleForward + 1.0/i;
        sumFloatForward = sumFloatForward + 1.0/i;
    }
    

    for(i=limit; i>0;i--){
        sumDoubleBackward = sumDoubleBackward + 1.0/i;
        sumFloatBackward = sumFloatBackward + 1.0/i;
    }    

    printf("sumDoubleForward: %f\n",sumDoubleForward);
    printf("sumFloatForward: %f\n",sumFloatForward);
    printf("sumDoubleBackward: %f\n",sumDoubleBackward);
    printf("sumFloatBackward: %f\n",sumFloatBackward);
    
    return (EXIT_SUCCESS);
}




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


pattern`щик
****


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

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



Цитата(Ares4322 @  7.9.2011,  09:28 Найти цитируемый пост)
Почему так происходит?

потому что я вам ответил в вашей прошлой теме. для стабильной и управляемой и одновременно переносимой(ОС/компилер) точности, используют библиотеки типа GMP.
PM WWW   Вверх
Ares4322
Дата 7.9.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 339
Регистрация: 25.9.2007
Где: Россия, Москва

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



Я понял, что нужно использовать GMP)
Но все-таки, почему при обратном проходе цикла в приведенный выше программе точность для float-ов выше?
PM MAIL   Вверх
Void
Дата 7.9.2011, 14:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Максимальная точность сложения достигается когда значения операндов близки друг к другу, точнее, имеют одинаковую экспоненту. Это очевидно из представления чисел с плавающей точкой: операнды необходимо привести к одной экспоненте перед выполнением операции. При сложении большого числа с малым младшие разряды последнего теряются при таком приведении. Поэтому точность суммы от меньших к большим будет выше.

Цитата(Ares4322 @  7.9.2011,  11:28 Найти цитируемый пост)
Если же делать то же самое для doublе-ов, то точность не изменяется.

Если вывести все 15 значащих цифр после запятой, то видно, что изменяется.

Это сообщение отредактировал(а) Void - 7.9.2011, 14:20


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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