Сообщение Re: printf double от 24.11.2019 14:19
Изменено 24.11.2019 14:21 lis_asm
Re: printf double
Здравствуйте, B0FEE664, Вы писали:
BFE>Как распечатать double со всей возможной точностью?
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;
}
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>Как распечатать 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;
}