използването на дългото двойно

Целта на функциите е да изчислят корен квадратен от число по метода на Нютон-Рафсън. Включих рутина printf в цикъла while, за да мога да виждам как стойността на корен 2 се доближава все по-близо до действителната стойност. Първоначално използвах float, за да дефинирам епсилон, но тъй като увеличих стойността на епсилон, стойността на върнатите резултати изглежда отрязана след определен брой цифри. Затова реших да превключа цялата променлива на long double и програмата показва отрицателни резултати. Как да го поправя?

//Function to calculate the absolute value of a number

#include <stdio.h>

long double absoluteValue (long double x)
{
    if (x < 0)
        x = -x;
    return (x);
}

//Function to compute the square root of a number

long double squareRoot (long double x, long double a)
{
    long double guess = 1.0;

    while ( absoluteValue (guess * guess - x) >= a){
        guess = (x / guess + guess) / 2.0;
        printf ("%Lf\n ", guess);
        }

    return guess;
}

    int main (void)
    {
    long double epsilon = 0.0000000000000001;

    printf ("\nsquareRoot (2.0) = %Lf\n\n\n\n", squareRoot (2.0, epsilon));
    printf ("\nsquareRoot (144.0) = %Lf\n\n\n\n", squareRoot (144.0, epsilon));
    printf ("\nsquareRoot (17.5) = %Lf\n", squareRoot (17.5, epsilon));

    return 0;
}

person Rockstar5645    schedule 30.05.2015    source източник
comment
Изпълнявам това на моя компютър (gcc версия 4.8.3 в cygwin) и получавам точно очакваните стойности.   -  person Matthew Carlson    schedule 30.05.2015
comment
Защо не работи на моя компютър, използвам Code::Blocks 13.12, трябва да работи.   -  person Rockstar5645    schedule 30.05.2015
comment
Редактирах отговора си, за да препоръчам да опитате просто double и да поставите някакъв код, за да избегнете безкраен цикъл.   -  person Matthew Carlson    schedule 30.05.2015
comment
Странична бележка: Функциите от семейството printf повишават float до double, така че третират %f и %lf по същия начин (очаквайки 8-байтов аргумент). Те (%f и %lf) се различават само когато се използват във функции от семейството scanf.   -  person barak manos    schedule 30.05.2015


Отговори (1)


Ако използвате версията на Code::Blocks с mingw, вижте този отговор: Спецификатор за преобразуване на long double в C

mingw ... printf does not support the 'long double' type.

Още малко подкрепяща документация за него.

http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3-a

Ако сте преминали направо от float към long double, можете да опитате просто да използвате double вместо това, което е два пъти по-дълго от float, за да започнете, и може да не се наложи да стигнете до long double.

За това бихте използвали спецификатора за печат на %lf и вашият цикъл може да искате да изглежда нещо подобно, за да предотвратите безкрайни цикли въз основа на вашия епсилон:

double squareRoot (    double x,     double a)
{
    double nextGuess = 1.0;
    double lastGuess = 0.0;

    while ( absoluteValue (nextGuess * nextGuess - x) >= a && nextGuess != lastGuess){
        lastGuess = nextGuess;
        nextGuess = (x / lastGuess + lastGuess) / 2.0;
        printf ("%lf\n ", nextGuess);
        }

    return nextGuess;
}
person Matthew Carlson    schedule 30.05.2015