Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Помогите с вычислительной математикой.  (Прочитано 869 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн yaromir

  • Автор темы
  • Активист
  • *
  • Сообщений: 670
    • Просмотр профиля
Всем здравствуйте.
Народ, помогите разобраться с вычислительной техникой. :-\
Мне нужно написать вычислительную процедуру на C, где нужно изменять некоторый параметр p от 1 до ... в задании загадочная формулировка "до нештатной реакции компьютера" :2funny: Поскольку параметр p будет иметь тип double, то я решил изменять его до нижней границы минимального диапазона double, который определен в C89: 10 ^ -37.

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

int main(void) {
    double p;
    for (p = 1; p > 1E-37; p *= 0.1) {
        printf("%38.37f\n", p);
    }
    return (EXIT_SUCCESS);
}

Вывод меня удивил:

(Нажмите, чтобы показать/скрыть)

55511151231257827021 - это уже не значащие цифры? Похоже на то, потому что они везде разные. Как определить, что цифра является значащей? По стандарту их должно быть не менее 10, тут 17 - замечательный результат. :)
Что интересно, и gcc, и cc (компилятор C из коллекции SunStudio) дают абсолютно одинаковый результат.
Как определить диапазон для конкретного компилятора, чтобы не отталкиваться от минимального диапазона C89?
Заранее спасибо.
« Последнее редактирование: 01 Марта 2010, 20:37:05 от yaromir »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Помогите с вычислительной математикой.
« Ответ #1 : 02 Марта 2010, 06:51:01 »
загловок limits.h ?

Оффлайн petrov

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Помогите с вычислительной математикой.
« Ответ #2 : 18 Апреля 2010, 22:45:12 »
Вот здесь много полезного по вычислительной математики если еще актуально конечно http://sdb.su/vich-mat/

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: Помогите с вычислительной математикой.
« Ответ #3 : 18 Апреля 2010, 22:57:33 »
В формате double под манциссу выделено 52 бита, что дает максимальную точность в 52*(log2/log10) = примерно 17 значащих десятичных знаков.

 

Страница сгенерирована за 0.055 секунд. Запросов: 25.