|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-08-13 14:14 UTC] ronlentjes at yahoo dot com dot au
Description:
------------
This has been an issue since 4.2.2 and still in 5.3.0.
$d = pow (-1.0, 0.3); // or anything causing NaN
echo "$d\n";
-> NAN
printf ("%f\n", $d);
(4.2.2) -> crash
(5.2.4) -> NaN<big-box><little-box><E-with-backslash-on-top>
(5.3.0) -> NaN<hex EF BF BD><hex EF BF BD><hex EF BF BD>
(viewed in browser as NaN???)
Two issues here:
Inconsistent display of NAN for echo and NaN for printf.
Output of bogus characters after the 3 letters NaN for printf.
I think you are missing a '\0' null termination after the NaN characters which probably cause a runaway to crash 4.2.2 but is just 'hanging' in there for the newer versions.
Cheers,
Ron Lentjes
LC CLS.
Reproduce code:
---------------
$d = pow (-1.0, 0.3);
echo "$d\n";
printf ("%f\n", $d);
Expected result:
----------------
NaN
NaN
Actual result:
--------------
(4.2.2)
NAN
crash
(5.2.4)
NAN
NaN<big-box><little-box><E-with-backslash-on-top>
(5.3.0)
NAN
NaN<hex EF BF BD><hex EF BF BD><hex EF BF BD>
(viewed in browser as NaN???)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 22:00:01 2025 UTC |
Perhaps you test it differently than I do. I'll give you the easiest way to see it happen: put this in a file called test.php: --- <? $d = pow(-1.0, 0.3); printf ("%f\n", $d); ?> --- Output will be (bash, Fedora 8, Linux): # php test.php --- NaN*A --- Output for browser will be NaN??? or NaN???F or other variations of that. This is reporducable on versions 4.2.2 (crash), 5.2.4, 5.3.0 (as indicated previously). I just retried this now. Cheers, Ron Lentjes LC CLS.The problem is with calling php_sprintf_appendstring. Its 9th parameter is not precision, it is length. Index: ext/standard/formatted_print.c =================================================================== --- ext/standard/formatted_print.c (revision 287513) +++ ext/standard/formatted_print.c (working copy) @@ -232,14 +232,14 @@ if (zend_isnan(number)) { is_negative = (number<0); php_sprintf_appendstring(buffer, pos, size, "NaN", 3, 0, padding, - alignment, precision, is_negative, 0, always_sign); + alignment, 3, is_negative, 0, always_sign); return; } if (zend_isinf(number)) { is_negative = (number<0); php_sprintf_appendstring(buffer, pos, size, "INF", 3, 0, padding, - alignment, precision, is_negative, 0, always_sign); + alignment, 3, is_negative, 0, always_sign); return; }I can't commit things. Somebody with SVN access should apply my patch and commit it. I've improved some things and added a testcase: Index: ext/standard/formatted_print.c =================================================================== --- ext/standard/formatted_print.c (revision 288201) +++ ext/standard/formatted_print.c (working copy) @@ -42,6 +42,8 @@ #define FLOAT_PRECISION 6 #define MAX_FLOAT_DIGITS 38 #define MAX_FLOAT_PRECISION 40 +#define NOT_A_NUMBER "NaN" +#define INFINITE "INF" #if 0 /* trick to control varargs functions through cpp */ @@ -231,15 +233,15 @@ if (zend_isnan(number)) { is_negative = (number<0); - php_sprintf_appendstring(buffer, pos, size, "NaN", 3, 0, padding, - alignment, precision, is_negative, 0, always_sign); + php_sprintf_appendstring(buffer, pos, size, NOT_A_NUMBER, strlen(NOT_A_NUMBER), 0, padding, + alignment, strlen(NOT_A_NUMBER), is_negative, 0, always_sign); return; } if (zend_isinf(number)) { is_negative = (number<0); - php_sprintf_appendstring(buffer, pos, size, "INF", 3, 0, padding, - alignment, precision, is_negative, 0, always_sign); + php_sprintf_appendstring(buffer, pos, size, INFINITE, strlen(INFINITE), 0, padding, + alignment, strlen(INFINITE), is_negative, 0, always_sign); return; } Index: ext/standard/tests/strings/bug49244.phpt =================================================================== --- ext/standard/tests/strings/bug49244.phpt (revision 0) +++ ext/standard/tests/strings/bug49244.phpt (revision 0) @@ -0,0 +1,8 @@ +--TEST-- +Bug #49244 (Floating point NaN cause garbage characters) +--FILE-- +<?php +printf("%f\n", pow(-1.0, 0.3)); +?> +--EXPECT-- +NaN