БлогNot. Паскаль точнее всех? :)

Паскаль точнее всех? :)

Запустим простенькую программку для определения точности представления вещественных чисел в нескольких разных средах...

Это результат из MathCAD 2001i:

Определение машинного eps. Результат из MAthCAD 2001i
Определение машинного eps. Результат из MAthCAD 2001i

А вот скриншот из MATLAB 7:

Определение машинного eps. Результат из MATLAB 7
Определение машинного eps. Результат из MATLAB 7

Аналогичная программа на Паскале (Turbo Pascal 7.1):

{$N+}
var eps:extended;
begin
 eps:=1;
 while 1+eps<>1 do eps:=eps/2;
 writeln (eps);
 reset (input); readln;
end.

выдала вот что:

5.42101086242752E-0020

т.е. 10-20! Для любого вещественного типа от real до extended. Надо заметить, что без включенной опции {$N+} (математический сопроцессор) Паскаль даст точность 4.5474735089E-13

По доке к Паскалю в нём есть 10-байтовые вещественные числа, в пакетах же под Windows используются обычно 8-байтовые.

Тип       Диапазон           Точность  Байт
Real      2.9e-39..1.7e38     11-12    6
Single    1.5e-45..3.4e38     7-8      4
Double    5.0e-324..1.7e308   15-16    8
Extended  3.4e-4932..1.1e4932 19-20    10
Comp     -9.2e18..9.2e18      19-20    8

Вот для сравнения программа на Visual Basic for Applications, выполненная в Excel 2003:

Sub Кнопка1_Щелкнуть()
 Dim eps As Double
 Dim i As Long
 i = 0
 eps = 1
 While 1 + eps <> 1
  eps = eps / 2
  i = i + 1
 Wend
 Worksheets("Лист1").Cells(1, 2).Value = eps
 Worksheets("Лист1").Cells(1, 3).Value = i
End Sub

(здесь дополнительно считается число шагов, выполненных циклом). А вот скриншот с результатами её запуска:

Определение машинного eps. Результат из Excel 2003
Определение машинного eps. Результат из Excel 2003

Как видим, результат полностью совпадает с MATLAB, и неудивительно - те же 8-байтовые числа.

Документ HTML, делающий то же самое с помощью Javascript:

<html>
<head>
 <title>Проверка машинного нуля</title>
</head>
<body>
 <script type="text/javascript">
  var eps=1;
  var count=0;
  while (1+eps!=1) { eps/=2; count++; }
  document.writeln ('<p>Eps='+eps);
  document.writeln ('<p>N='+count);
 </script>
</body>
</html>

Результат на 100% совпадает с MATLAB и Excel:

Определение машинного eps. Результат из JavaScript
Определение машинного eps. Результат из JavaScript

 Отправлено на постоянное хранение сюда

06.10.2009, 15:20 [11278 просмотров]


теги: javascript excel алгоритм mathcad vba pascal

К этой статье пока нет комментариев, Ваш будет первым