 <p>You should use strtod; it checks double overflow/underflow also like:</p> <pre><code>#include &lt;errno.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; double d; char *e,s[100]; fgets(s,100,stdin); if( s[strlen(s)-1]=='\n' ) s[strlen(s)-1]=0; errno=0; d=strtod(s,&amp;e); if( *e || errno==EINVAL || errno==ERANGE ) puts("error"); else printf("d=%f\n",d); </code></pre>