Ошибка в функции MathCeil() или в логике округления данных - страница 2

 
Rosh:
А так?

В денвере "integer15"

а если так

<?
$i1 = 140579.0;
$i2 = 35579.0;
 
$d1 = $i1 - $i2;
 
echo(gettype($d1 / 7000));
echo Ceil($d1 / 7000);
 
?>
то "double15"
 

В правильном языке программирования вообще про такую ерунду задумываться не нужно

вот маткад и все правильно расчитывается не надо думать какой это тип int double или это вообще комплексное число или допустим матрица. Все считается верно. Так как и должно по законам математики.

 
Rosh:
А так?
<?
$i1 = 140579;
$i2 = 35579;
 
$d1 = $i1 - $i2;
 
echo(gettype($d1 / 7000));
echo Ceil($d1 / 7000);
 
?>

Да же так:
<?
$i1 = 140579.000;
$i2 = 35579.000;
settype($d1, "float");
$d1 = $i1 - $i2;

echo Ceil($d1 / 7000);
?>
или так:
<?
$i1 = 140579.000;
$i2 = 35579.000;

$d1=(double)$i1 - $i2;
echo Ceil($d1 / 7000);
?>
Результат = 15.


А вот так:
<?
echo Ceil(15.000000000000002);
?>
Результат = 16.
 
Prival:

В правильном языке программирования вообще про такую ерунду задумываться не нужно

Но в подавляющем большинстве компьютерных языков (C, C++, Pascal, C#, Java и тд) об этом приходится задумываться.
А MQL4 - это вариант языка C.
 

Языки программирования делятся не на правильные и неправильные, а на языки высокого и низкого уровня. Языки высокого уровня находятся ближе к потребностям человека (удобны, но медленны), низкого - к особенностям машины (быстры но не удобны).

 
MathCeil() - функция, теоретически разрывная в целых точках. Практически в языке она может терпеть разрыв, как только аргумент попадает в эпсилон-окрестность целого (об эпсилон см. выше). Ни о каких гарантиях точности вычисления в этой окрестности говорить нельзя. Prival, кстати, в твоем примере нет вычисления этой функции.
 
Renat:
Prival:

В правильном языке программирования вообще про такую ерунду задумываться не нужно

Но в подавляющем большинстве компьютерных языков (C, C++, Pascal, C#, Java и тд) об этом приходится задумываться.
А MQL4 - это вариант языка C.


У PHP одна из ног - тоже С, но результат см. выше.
 

на C# считается корректно:


int i1 = 140579;

int i2 = 35579;

double d1 = i1 - i2;

Console .Write( Math .Ceiling(d1/7000));


результат: 15

 
на Java также корректно считается, наверное это можно объяснить тем, что и C# и Java выполняются виртуальным процессором
 
А теперь резонный вопрос, где кроме MQL выполняется не корректно?