Информация об изменениях

Сообщение Re: printf double от 24.11.2019 14:19

Изменено 24.11.2019 14:21 lis_asm

Re: printf double
Здравствуйте, B0FEE664, Вы писали:

BFE>Как распечатать double со всей возможной точностью?


BFE>
BFE>#include <stdio.h>      /* printf */
BFE>#include <math.h>       /* acos */

BFE>int main ()
BFE>{
BFE>  double pi = 2 * acos (0);
BFE>  printf ("The pi = %f\n", pi);
BFE>  return 0;
BFE>}
BFE>




А руками?


typedef long long INTEGER;
typedef double FLOATING;
typedef wchar_t SYMC;


SYMC *PrintNum(INTEGER val, SYMC *str)
{
if (val < 0)
*(str++) = '-';

INTEGER v = val;
do
str++;
while (v /= 10);

SYMC *strret = str;
*str = 0;

do
{
int c = val % 10;
*(--str) = (c < 0 ? -c : c) + '0';
} while (val /= 10);

return strret;
}

void PrintFlt(FLOATING val, SYMC *str)
{
if (val < 0)
{
*(str++) = '-';
val = -val;
}
if (val == 0)
{
str += StrCpyCvt(str, "0.0");
*str = 0;
return;
}
FLOATING inf = val * 2;
if (*(INTEGER *)&val == *(INTEGER *)&inf)
{
str += StrCpyCvt(str, "1.#IND");
*str = 0;
return;
}

int pow = 0;
FLOATING divser = 1;
while (val >= divser * 10)
divser *= 10, pow++;
while (val < divser)
divser *= 0.1, pow--;
int powd = 0;

int cnt = 14;
if (pow < 7 && pow > -5)
{
powd = pow;
if (pow < 0)
{
cnt -= pow;
divser = 1;
powd = 0;
}
pow = 0;
}

do
{
int dig = (int)(val / divser);
*(str++) = dig + '0';
if (val == 0 && powd < 0)
break;
val -= dig * divser;
divser *= 0.1;
if (!(powd--))
*(str++) = '.';
} while (cnt--);

if (pow)
{
*(str++) = 'e';
str = PrintNum(pow, str);
}

*str = 0;
}
Re: printf double
Здравствуйте, B0FEE664, Вы писали:

BFE>Как распечатать double со всей возможной точностью?


BFE>
BFE>#include <stdio.h>      /* printf */
BFE>#include <math.h>       /* acos */

BFE>int main ()
BFE>{
BFE>  double pi = 2 * acos (0);
BFE>  printf ("The pi = %f\n", pi);
BFE>  return 0;
BFE>}
BFE>




А руками?

typedef long long INTEGER;
typedef double FLOATING;
typedef wchar_t SYMC;


SYMC *PrintNum(INTEGER val, SYMC *str)
{
    if (val < 0)
        *(str++) = '-';

    INTEGER v = val;
    do
        str++;
    while (v /= 10);

    SYMC *strret = str;
    *str = 0;

    do
    {
        int c = val % 10;
        *(--str) = (c < 0 ? -c : c) + '0';
    } while (val /= 10);

    return strret;
}

void PrintFlt(FLOATING val, SYMC *str)
{
    if (val < 0)
    {
        *(str++) = '-';
        val = -val;
    }
    if (val == 0)
    {
        str += StrCpyCvt(str, "0.0");
        *str = 0;
        return;
    }
    FLOATING inf = val * 2;
    if (*(INTEGER *)&val == *(INTEGER *)&inf)
    {
        str += StrCpyCvt(str, "1.#IND");
        *str = 0;
        return;
    }

    int pow = 0;
    FLOATING divser = 1;
    while (val >= divser * 10)
        divser *= 10, pow++;
    while (val < divser)
        divser *= 0.1, pow--;
    int powd = 0;

    int cnt = 14;
    if (pow < 7 && pow > -5)
    {
        powd = pow;
        if (pow < 0)
        {
            cnt -= pow;
            divser = 1;
            powd = 0;
        }
        pow = 0;
    }

    do
    {
        int dig = (int)(val / divser);
        *(str++) = dig + '0';
        if (val == 0 && powd < 0)
            break;
        val -= dig * divser;
        divser *= 0.1;
        if (!(powd--))
            *(str++) = '.';
    } while (cnt--);

    if (pow)
    {   
        *(str++) = 'e';
        str = PrintNum(pow, str);
    }

    *str = 0;
}