php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #15946 Math output errors
Submitted: 2002-03-07 22:55 UTC Modified: 2002-06-07 01:00 UTC
From: aubieweb at rogers dot com Assigned:
Status: No Feedback Package: Math related
PHP Version: 4.1.1 OS: Windows 2000
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: aubieweb at rogers dot com
New email:
PHP Version: OS:

 

 [2002-03-07 22:55 UTC] aubieweb at rogers dot com
I wrote a script which output Pascal's triangle and then showed the numbers which were divisible by a certain number in a different colour.  At first, this works fine.  Then after the 20th row or so, the % operator starts outputting incorrect numbers.  For example, 37 % 4 returns 1.  24 % 4 returns 3.  When those numbers are checked on their own, it works fine.  In the loops though, it starts giving incorrect information after 20 rows.  You can see this at www.alkaline2.com/triangle.php

CODE

<?
$rows--;

for ($r = 0; $r <= $rows; $r++)
{
	if ($hidenum) print "<table cellpadding='0' cellspacing='0' border='1' bordercolor='#000088' borderstyle='solid'><tr>\n";
	if (!$hidenum) print "<table cellpadding='2' cellspacing='1' border='0'><tr>\n";
	
	for ($i = 0; $i <= $r; $i++)
	{
		$num = factorial($r)/(factorial($r - $i) * factorial($i));
		
		if ($divisor > 0 && $num % $divisor == 0)
		{
			$bgcolor='#ff0000';
		}
		else
		{
			$bgcolor='#444444';
		}
	
	if (!$hidenum) print "<td bgcolor='$bgcolor'><span class='text'>$num</span></td>\n";
	$check = $num % $divisor;
	if ($hidenum && $divisor > 0 && $num % $divisor == 0) print "<td><img src='red.gif' width='$size' height='$size' alt='$num % $divisor = $check'></td>\n";
	if ($hidenum && $divisor > 0 && $num % $divisor != 0) print "<td><img src='grey.gif' width='$size' height='$size' alt='$num % $divisor = $check'></td>\n";
	if ($hidenum && $divisor == 0) print "<td><img src='grey.gif' width='$size' height='$size' alt='$num % $divisor = $check'></td>\n";
	
	}
	print "</tr></table>";
}

function factorial($x)
{
	$total = 1;
	for ($i = $x; $i > 1; $i--)
		$total = $total * $i;
	return $total;
}

?>

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-03-08 06:20 UTC] sander@php.net
Are you completely sure that it's an error in PHP and not in your algorithm?
 [2002-03-08 06:27 UTC] sander@php.net
(reclassified)
 [2002-03-08 07:19 UTC] aubieweb at rogers dot com
Yes.  Here is the exact code that shows the calculuation.

$check = $num % $divisor;
	if ($hidenum && $divisor > 0 && $num % $divisor == 0) print "<td><img
src='red.gif' width='$size' height='$size' alt='$num % $divisor =
$check'></td>\n";

As yuo can see, the calculation is very simple (top line) and the alt of the image shows both numbers exactly and they haven't been changed.  In that piece of code I get the bad results but only AFTER the loop has been running for some time.
 [2002-03-08 16:52 UTC] aubieweb at rogers dot com
OK.  I added a bunch of round()'s around the variables and the problem seems to have been fixed up to 48 rows.  This just seems to be numbers start loosing accuracy after a while.  Even smaller numbers.
 [2002-06-07 01:00 UTC] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a month, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Mon Dec 09 23:01:27 2024 UTC