Support for printing NaN and infinity from Andrew Tridgell

This commit is contained in:
Gregory Nutt
2013-04-17 07:40:48 -06:00
parent 504b25ee2b
commit 06871729dd
+40 -3
View File
@@ -44,6 +44,8 @@
* Included Files * Included Files
****************************************************************************/ ****************************************************************************/
#include <math.h>
#include "lib_internal.h" #include "lib_internal.h"
/**************************************************************************** /****************************************************************************
@@ -84,6 +86,10 @@
* Private Variables * Private Variables
****************************************************************************/ ****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: zeroes * Name: zeroes
* *
@@ -103,9 +109,21 @@ static void zeroes(FAR struct lib_outstream_s *obj, int nzeroes)
} }
/**************************************************************************** /****************************************************************************
* Private Functions * Name: lib_dtoa_string
*
* Description:
* Print the specified string
*
****************************************************************************/ ****************************************************************************/
static void lib_dtoa_string(FAR struct lib_outstream_s *obj, const char *str)
{
while (*str)
{
obj->put(obj, *str++);
}
}
/**************************************************************************** /****************************************************************************
* Name: lib_dtoa * Name: lib_dtoa
* *
@@ -140,6 +158,25 @@ static void lib_dtoa(FAR struct lib_outstream_s *obj, int fmt, int prec,
int dsgn; /* Unused sign indicator */ int dsgn; /* Unused sign indicator */
int i; int i;
/* Special handling for NaN and Infinity */
if (isnan(value))
{
lib_dtoa_string(obj, "NaN");
return;
}
if (isinf(value))
{
if (value < 0.0d)
{
obj->put(obj, '-');
}
lib_dtoa_string(obj, "Infinity");
return;
}
/* Non-zero... positive or negative */ /* Non-zero... positive or negative */
if (value < 0) if (value < 0)
@@ -173,7 +210,7 @@ static void lib_dtoa(FAR struct lib_outstream_s *obj, int fmt, int prec,
obj->put(obj, '0'); obj->put(obj, '0');
/* A decimal point is printed only in the alternate form or if a /* A decimal point is printed only in the alternate form or if a
* particular precision is requested. * particular precision is requested.
*/ */
@@ -227,7 +264,7 @@ static void lib_dtoa(FAR struct lib_outstream_s *obj, int fmt, int prec,
for (i = expt; i > 0; i--) for (i = expt; i > 0; i--)
{ {
if (*digits != '\0') if (*digits != '\0')
{ {
obj->put(obj, *digits); obj->put(obj, *digits);
digits++; digits++;
} }