2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Как получить большую точность в C?
Сообщение24.02.2021, 11:38 
Аватара пользователя


12/02/20
282
Написан код в С который итерирует простой алгоритм
Код:
#include <stdio.h>
#include <math.h>

int main()
{
    double a = 3.141592;
    double b = 2.718281;
    double c = 0.693147;
   
   
   
    for(int i = 0; i < 100; i++){
        double n = (a+b-c)*(a+c-b)*(b+c-a)/(4*a*b*c);
        printf("%lf %lf %lf %lf \n",n, a, b, c);
        double an = (b+c-a)*sqrt((a+b-c)*(a+c-b)/(4*b*c));
        double bn = (a+c-b)*sqrt((a+b-c)*(b+c-a)/(4*a*c));
        double cn = (a+b-c)*sqrt((a+c-b)*(b+c-a)/(4*a*b));
        a = an;
        b = bn;
        c = cn;
    }
    return 0;
}


Однако после нескольких итераций $a, b, c$ становятся настолько малы что компилятор их считает за равные числа. Как получить больше точности в вычислениях?

 Профиль  
                  
 
 Re: Как получить большую точность в C?
Сообщение24.02.2021, 11:49 
Заслуженный участник


09/05/12
25179
Ну для начала надо бы повысить точность не вычислений, а вывода. Замените формат на что-нибудь вроде %18.16lf, а еще лучше - %18.16e, сразу же обнаружится, что под ковром есть жизнь. :mrgreen:

 Профиль  
                  
 
 Re: Как получить большую точность в C?
Сообщение24.02.2021, 12:21 
Аватара пользователя


12/02/20
282
Pphantom, спасибо :D

Для меня в новинку решать математические и физические задачи компьютерным кодом, а оказывается это очень даже нужно уметь делать

 Профиль  
                  
 
 Re: Как получить большую точность в C?
Сообщение24.02.2021, 12:53 
Заслуженный участник


18/01/15
3231
Замена переменных и масштабирование, предваряемые теоретическим анализом. В вашем случае видно, на глаз, что $(a_k,b_k,c_k)\longrightarrow(0,0,0)$ при $k\longrightarrow\infty$, причем убывание примерно как $2^{-k}$ (вследствие чего оно где-то через 2000 итераций обращается в голый нуль; а при неправильном формате вывода вообще через несколько десятков). А вот если заменить переменные как $a'_k=2^ka_k$, $b'_k=2^kb_k$, $c'_k=2^kc_k$, и написать итерационные формулы для штрихованых последовательностей (кстати, вопрос на засыпку, как эти формулы написать ?), то там уже не будет в нуль обращаться.

-- 24.02.2021, 11:56 --

А кстати, там похоже и вообще квадратный корень из отрицательного числа может возникнуть ...

-- 24.02.2021, 12:12 --

vpb в сообщении #1506354 писал(а):
А кстати, там похоже и вообще квадратный корень из отрицательного числа может возникнуть ...
А нет, не возникнет. Судя по тому, что это из соседней темы про треугольник.

 Профиль  
                  
 
 Re: Как получить большую точность в C?
Сообщение25.02.2021, 01:50 
Аватара пользователя


07/02/12
1438
Питер
vpb в сообщении #1506354 писал(а):
и написать итерационные формулы для штрихованых последовательностей (кстати, вопрос на засыпку, как эти формулы написать ?)
Там, вероятно, нормировать экспоненту будет недостаточным. Фиксированная мантисса за такое кол-во итераций тоже замусорится изрядно.

 Профиль  
                  
 
 Re: Как получить большую точность в C?
Сообщение25.02.2021, 01:56 
Заслуженный участник


27/04/09
28128
Вообще стоило бы выражать углы, и Sender в той другой теме сказал, что они просто выражаются. А, нет, легко выражаются, но надеюсь что и просто (мне лень выражать, но я предлагал ТС это делать уже давно, раз интересующие в задаче величины инвариантны относительно преобразований подобия).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group