Try strtold() perhaps.  It happily reads all the formats (15892938475,
1.5892938475E10 etc) you asked for.
If the significand part of the float is as large or larger than the
int type, then you can convert the result to an int type with no loss
of precision.  80 bit long double (common on x86) has a 64 bit
significand which can (and was designed to) store a 64 bit integer.
Double has a 53 bit significand which can safely hold a 32 bit
integer.

for example:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
int
main( int argc, char *argv[] )
{
  char *endp;
  long double x = strtold( argv[1], &endp );
  if( endp == argv[1] || x > LLONG_MAX || x < LLONG_MIN )
  {
    printf("bad or out of range number\n");
    exit(1);
  }
  long long int y = llround(x);
  printf("y = %lld\n", y );
}

Reply via email to