2014 dxdy logo

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

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




 
 Как получить большую точность в C?
Сообщение24.02.2021, 11:38 
Аватара пользователя
Написан код в С который итерирует простой алгоритм
Код:
#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 
Ну для начала надо бы повысить точность не вычислений, а вывода. Замените формат на что-нибудь вроде %18.16lf, а еще лучше - %18.16e, сразу же обнаружится, что под ковром есть жизнь. :mrgreen:

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

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

 
 
 
 Re: Как получить большую точность в C?
Сообщение24.02.2021, 12:53 
Замена переменных и масштабирование, предваряемые теоретическим анализом. В вашем случае видно, на глаз, что $(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 
Аватара пользователя
vpb в сообщении #1506354 писал(а):
и написать итерационные формулы для штрихованых последовательностей (кстати, вопрос на засыпку, как эти формулы написать ?)
Там, вероятно, нормировать экспоненту будет недостаточным. Фиксированная мантисса за такое кол-во итераций тоже замусорится изрядно.

 
 
 
 Re: Как получить большую точность в C?
Сообщение25.02.2021, 01:56 
Вообще стоило бы выражать углы, и Sender в той другой теме сказал, что они просто выражаются. А, нет, легко выражаются, но надеюсь что и просто (мне лень выражать, но я предлагал ТС это делать уже давно, раз интересующие в задаче величины инвариантны относительно преобразований подобия).

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group