Bug #74451 [Com]: Sine values exceed 1
Edit report at https://bugs.php.net/bug.php?id=74451&edit=1
ID: 74451
Comment by: m_sun at mail dot ru
Reported by: m_sun at mail dot ru
Summary: Sine values exceed 1
Status: Feedback
Type: Bug
Package: Math related
Operating System: Alpine Linux
PHP Version: 5.6.30
Block user comment: N
Private report: N
New Comment:
PS: Seems like this is not a hardware issue, neither musl libc. Result is always the same even after
restarting php5-fpm. Alpine Linux uses grsec patch and loads binaries in arbitrary memory addresses
on each start.
I additionally posted a bug report on Alpine Linux board.
Previous Comments:
------------------------------------------------------------------------
[2017-04-16 22:07:25] m_sun at mail dot ru
Standard libc sin() works just fine. Bc also gives correct result on the machine in question:
echo 's(60)' | bc -l
But problem with php is still there:
php5 -r 'echo sin(60) . "\n";'
output is 19880855899899
Right now I use a workaround
echo sin(fmod(60, M_PI * 2));
------------------------------------------------------------------------
[2017-04-16 18:21:53] requinix@php.net
Does a simple
#include <math.h>
#include <stdio.h>
void main(void) { printf("%f\n", sin(60.0)); }
work correctly?
------------------------------------------------------------------------
[2017-04-16 11:16:53] m_sun at mail dot ru
You are right: the problem can't be reproduced in a testbed for PHP 5.6.30. I suppose there is
a problem in realization (librariess are compiled against musl libc on Alpine Linux) or a hardware
issue...
Thank you danack at php dot com
<?php
$start = 60.0;
$a = $start;
$da = 0.1;
$target = M_PI + $start;
$tab = array();
while ($a < $target) {
$item['rad'] = $a;
$item['deg'] = number_format(rad2deg($a), 2);
$item['sin'] = sin($a);
$item['cos'] = cos($a);
$tab[] = $item;
$a += $da;
}
?>
<style>
table, td, th {
border-collapse:collapse;
border:1px solid #000;
}
</style>
<table>
<tr>
<th>Radian</th>
<th>Degrees</th>
<th>Sin</th>
<th>Cos</th>
</tr>
<?php foreach($tab as $item): ?>
<tr>
<td><?= $item['rad'] ?></td>
<td><?= $item['deg'] ?></td>
<td><?= $item['sin'] ?></td>
<td><?= $item['cos'] ?></td>
</tr>
<?php endforeach; ?>
</table>
------------------------------------------------------------------------
[2017-04-16 10:17:18] danack@php.net
I can't reproduce what you're reporting: https://3v4l.org/fnd5R
Please can you provide an actual runnable reproduce script.
------------------------------------------------------------------------
[2017-04-16 03:39:25] m_sun at mail dot ru
Description:
------------
Absolute values of sine and cosine functions may somehow exceed 1 when argument is more then 2 * pi
Test script:
---------------
$sin = sin(60.0); // $sin contains 19880855899899 now
$sin = sin (fmod (60.0, M_PI * 2)); // Gives correct result now
Actual result:
--------------
Radian Degrees Sin Cos
60 3,437.75 19880855899899 -84637265064481
60.1 3,443.48 20318846900770 -86648047391510
60.2 3,449.21 20765725188326 -88703090857283
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=74451&edit=1
Thread (7 messages)