Ошибка floating point division by zero delphi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  x0, y0:integer; //начало координатных осей
  l, a, b:integer;
 x,y,i, ymin, ymax, xmin,xmax:real;
  dx,mx,my,dy:real;
  const m = 50;
   e=0.01;
 
implementation
 
{$R *.dfm}
 
 
 function f(x:real):real;
 begin
   result:= sin(x);
 end;
 
procedure TForm1.Button1Click(Sender: TObject);
  begin
  l:=b-a;
  mx:=410/l;
  dx:=l/410;
 
  ymax:=f(a);
  ymin:=f(b);
  i:=a;
   repeat
     if f(i)<ymin then
       ymin:=f(i);
     if f(i)>ymax then
        ymax:=f(i);
    i:=i+dx;
   until i<=b;
 
   my:=440/(ymax-ymin);
 
   with Image1 do
   begin
     Canvas.Pen.Color:=clWhite;
     Canvas.Rectangle(0, 0, ClientWidth, ClientHeight);
     a:=StrToInt(Edit1.Text);
     b:=StrToInt(Edit2.Text);
     x0:= 45;
     y0:= 30;
 
     with Canvas do
      begin
       Pen.Color:=Clblack;// координатная прямая
       Pen.Width:= 1;
       MoveTo(x0,y0);
       LineTo(x0, Height-y0);
       MoveTo(x0,Height-y0);
       LineTo(Width-x0,Height-y0);
       {*LineTo(45,320);
       MoveTo(45,320);
       LineTo(360,320);*}
       MoveTo(x0,y0);
       LineTo( x0-3,y0+13);
       MoveTo(x0,y0);
       LineTo(x0+3, y0+13 );
       {*MoveTo(45,20);
       LineTo(42,33);
       MoveTo(45,20);
       LineTo(48,33);*}
        MoveTo(Width-x0, Height-y0);
        LineTo(Width-x0-13, Height-y0+3);
        MoveTo(Width-x0, Height-y0);
        LineTo(Width-x0-13, Height-y0-3);
       {*MoveTo(360,320);
       LineTo(347,323);
       MoveTo(360,320);
       LineTo(347,317);
       kx:=(Width-90)/(xmax-xmin);
       ky:=(Height-60)/(ymax-ymin);
          y:=f(a);
          x:=a;
           while a < b do
           begin
             a:=a+e;
             if f(a)< y then
             begin y:=f(a);
             x:=a;
             end;*}
 
      Pen.Color:=Clred;
      Pen.Width:= 2;
       x:=a;
       y:=f(x);
       y0:=440;
       MoveTo(x0,y0-Trunc(f(x)*my-ymin*my));
       repeat
       x:=x+dx;
       y:=f(x);
       LineTo(Trunc(x*mx-a*mx)+x0,y0- Trunc(y*my-ymin*my));
       until x>= b ;
 
       end;
    end;
  end;
  end.

Всем привет дорогие читатели блога, а самое главное, любители MapWindow GIS и вообще, любых других геоинформационных систем. Я обещал, что буду постепенно публиковать  материал  по новой версии MapWindow GIS, поэтому данная небольшая статья для решения одной проблемы с новой версии.

Мне уже задавали этот вопрос, а именно, что когда устанавливают компонент TMap на свою форму, а затем просто при компиляции проекта появляется ошибка: floating point division by zero. Если честно, то я не знаю, в какой момент она возникает. Может это связано с системой координат, либо еще что-то, но решается она очень и очень просто, по крайней мере, я так ее решил. Эту ошибку я наблюдал в Delphi 7, что касается других версий Delphi, я сказать ничего не могу, поэтому ее может просто и не быть.

Поэтому, если после обновления MapWindow GIS до версии 4.9.1 или 4.9.2 у Вас появляется подобная ошибка, то ниже будет описано, как ее можно решить. Мы просто отключим исключения, которые возникают с использованием чисел с плавающей точкой.

Для начала нам нужно объявить константу:

const MCW_EM = DWord($133f);

А затем на событие OnCreate формы, либо можно OnShow пишем следующий код:

Вот и все, как видите, ничего сложного. Теперь нам необходимо просто установить компонент на форму и скомпилировать проект. У меня такой ошибки больше не появляется, и программа отрабатывает на 100 процентов.

I just tried the following code:

procedure TTTest.FormCreate(Sender: TObject);
var v: extended;
    one: extended;
begin
  one := 1.0;
  v := 100*Power(1.25,one);
end;

It just compiles and runs as expected in Delphi 5.

My guess is that the division per zero flag may be set outside your code (even if you do not link to C++ code, calling Direct X or such may have the same effect), but raised later, in _Frac.

The only call to Frac in the standard implementation of Power() is to test Frac(Exponent) = 0.0.

There was a modification in the implementation of Frac between Delphi 5 and Delphi 6.

Here is the Delphi 5 version:

procedure       _FRAC;
asm
    FLD     ST(0)
    SUB     ESP,4
    FSTCW   [ESP]
    FWAIT
    FLDCW   cwChop
    FRNDINT
    FWAIT
    FLDCW   [ESP]
    ADD     ESP,4
    FSUB
end;

Here is the Delphi 6 version:

procedure       _FRAC;
asm
    FLD     ST(0)
    SUB     ESP,4
    FNSTCW  [ESP].Word     // save
    FNSTCW  [ESP+2].Word   // scratch
    FWAIT
    OR      [ESP+2].Word, $0F00  // trunc toward zero, full precision
    FLDCW   [ESP+2].Word
    FRNDINT
    FWAIT
    FLDCW   [ESP].Word
    ADD     ESP,4
    FSUB
end;

From the above code, you’ll find out that the following commands caused the delayed exceptions to be raised before Delphi 6 was released: Trunc, Frac, Ceil.

So I guess you faced an issue with Delphi 5, which has been fixed with Delphi 6. You may have to use your own version of Power, like this one:

function Power(Base, Exponent: Extended): Extended;
begin
  if Exponent = 0.0 then
    Result := 1.0               { n**0 = 1 }
  else if (Base = 0.0) and (Exponent > 0.0) then
    Result := 0.0               { 0**n = 0, n > 0 }
  else
    Result := Exp(Exponent * Ln(Base))
end;

Содержание

  1. Ошибка делфи project Project1.exe raised exception class EZeroDivide with message ‘Floating point division by zero’.
  2. Экспертная система Delphi.int.ru
  3. Сообщество программистов Общение, помощь, обмен опытом
  4. Delphi.int.ru Expert
  5. Другие разделы портала
  6. Переход к вопросу:
  7. Статистика за сегодня:
  8. Лучшие эксперты
  9. Вопрос # 5 783
  10. Мини-форум вопроса
  11. Научный форум dxdy
  12. Решения ряда. При больших порядках программа выдает ошибку
  13. Кто сейчас на конференции

Ошибка делфи project Project1.exe raised exception class EZeroDivide with message ‘Floating point division by zero’.

Помогите исправить
unit Unit1;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ActnList, StdCtrls ;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Image1: TImage;
Start: TButton;
Stop: TButton;
Button3: TButton;
ActionList1: TActionList;
Timer1: TTimer;
procedure Button3Click(Sender: TObject);
procedure StartExecute(Sender: TObject);
procedure StartUpdate(Sender: TObject);
procedure StopExecute(Sender: TObject);
procedure StopUpdate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
< Private declarations >
u,l,g,t,a:real;
dt0:dword;
public
< Public declarations >
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
groupbox1.Height:=195
end;

procedure TForm1.StartExecute(Sender: TObject);
begin
u:=strtofloat(edit1.text);
l:=strtofloat(edit2.text);
g:=strtofloat(edit3.text);
a:=l*sin(u*pi/180);
t:=2*pi*sqrt(l/g);
edit4.text:=format(‘%f’,[t]);
dt0:=gettickcount;
timer1.enabled:=true;
end;

procedure TForm1.StartUpdate(Sender: TObject);
begin
taction(sender).enabled:=not timer1.enabled;
end;

procedure TForm1.StopExecute(Sender: TObject);
begin
timer1.enabled:=false;
end;

procedure TForm1.StopUpdate(Sender: TObject);
begin
taction(sender).Enabled:=timer1.enabled;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const pr:integer=7;
var
dt,x,y,k:extended;
px,py,cx,cy:integer;
begin

k:=trunc(image1.height*0.9);
cx:=image1.width div 2;
cy:=20;
px:=trunc(x*k/l)+cx;
py:=trunc(y*k/l)+cy;

Источник

Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

Статистика за сегодня:

Онлайн на сайте: 12 ( 3404)
Онлайн в IRC: 2 ( 17)
Последние новости:
30 апреля 2012
Последний вопрос:
9 августа 2022, 09:39
Последний ответ:
29 марта 2018, 23:32

Лучшие эксперты

Вопрос # 5 783

почему если сделать

не показывается никакой ошибки типа ‘division by zero’?

и в таком варианте тоже:
var
i:real;
begin
ErrorProc :=nil;
ExceptProc :=nil;
ExceptionClass :=nil;
ExceptClsProc :=nil;
ExceptObjProc :=nil;
AssertErrorProc:=nil;
i:=1/0;
end;

нужно, чтобы любые ошибки были видны.

Вопрос задал: Фамилия Имя Отчество (статус: Посетитель)
Вопрос отправлен: 27 ноября 2011, 06:39
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Толяныч

Здравствуйте, Фамилия Имя Отчество!
Не показывает, потому что никакой операции деления тут нет.
Выражение i := 1/0 присваивает переменной i максимально возможное положительное значение. Если посмотреть отладчиком, то в i увидим +INF .

Вот цитата из хелпа по запросу «Infinity constant».

Чтоб получить ожидаемую реакцию, нужно :

Странноватый выбор идентификатора i для real. Но это так, к слову.

Ответ отправил: Толяныч (статус: 4-ый класс)
Время отправки: 27 ноября 2011, 23:07
Оценка за ответ: 4

Комментарий к оценке: ничего не изменилось, всё равно никакой ошибка не показывает.

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c:real;
begin
a:=0.0;
b:=1.0;
с:=b/a;
end;

Ответ #2. Отвечает эксперт: Егор

Здравствуйте, Фамилия Имя Отчество!
Правы все эксперты.
Поясню на примерах:

1) Программа откомпилируется и будет работать. Выражение 1/0 будет вычислено компилятором (об этом ниже), но затем, на фазе оптимизации, т.к. переменная z не используется, то компилятор выкинет любые упоминания этой переменной. Ошибка не возникнет.

2) Программа откомпилируется и будет работать. Выдаваться будет INF, т.к. для дробных чисел предусмотрено специальное значение — бесконечность (INF). Значение это будет вычислено компилятором до запуска программы, а в текст будет подставлено именно значение INF, а не выражение 1/0.
Аналогично можно записать (должен быть подключен модуль Math).

3) Здесь произойдёт ошибка времени выполнения. Во время работы программы будет выдано сообщение «Floating point division by zero».

4) Т.к. числа целые (integer), то использовать операцию деления (/) нельзя. Вместо неё используется операция целочисленного деления (div).
Во время работы программы будет выдано сообщение об ошибке деления на ноль: «Division by zero».

5) Этот вариант не скомпилируется вообще, т.к. здесь идёт попытка заставить компилятор разделить нацело целое число на ноль.

5) Несмотря на то, что переменная с не используется, этот вариант также не скомпилируется. Причина — у нас есть выражение (1 div 0), которое надо вычислить. Вычисление будет выполнено до фазы оптимизации, поэтому процесс компиляции не будет успешным.

P.S. Все варианты проверялись в Delphi7.

Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 28 ноября 2011, 16:54
Оценка за ответ: 5

Мини-форум вопроса

min@y™ (статус: Доктор наук), 27 ноября 2011, 09:10 [#1] :

Цитата (Фамилия Имя Отчество):

Фамилия Имя Отчество (статус: Посетитель), 28 ноября 2011, 13:58 [#2] :

>>Может компайлер просто выкинул эту операцию, т.к. переменная i больше не используется?

тоже не работает

Вадим К (статус: Академик), 28 ноября 2011, 14:48 [#3] :

это оптимизации.
Попробуйте написать так

Толяныч (статус: 4-ый класс), 29 ноября 2011, 00:37 [#4] :

Все работает — и в среде под отладчиком, и автономно. Может, у Вас не Delphi ?

Фамилия Имя Отчество (статус: Посетитель), 29 ноября 2011, 00:51 [#5] :

Вариант, подсказанный Вадимом работает!
Спасибо.

9 декабря 2011, 14:42: Статус вопроса изменён на решённый (изменил автор вопроса — Фамилия Имя Отчество): Ура! Мне дали награду за лучший вопрос месяца! Надо отметить!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Источник

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки

Вход Регистрация Donate FAQ Правила Поиск

Решения ряда. При больших порядках программа выдает ошибку

Последний раз редактировалось Toucan 27.09.2010, 14:48, всего редактировалось 1 раз.
Вставил тег syntax

Задание заключается в следующем: нужно вычислить значение функционального ряда до N-го порядка малости.

Ряд задан формулой:
Сразу задался вопросом, какой будет общий член у этого ряда. Свёл к следующему:

Теперь нужно было реализовать программу, вот она:

uses
Windows , Messages , SysUtils , Variants , Classes , Graphics , Controls , Forms ,
Dialogs , StdCtrls , Math;

type
TForm1 = class ( TForm )
Edit1 : TEdit;
Button1 : TButton;
Label1 : TLabel;
Label2 : TLabel;
Edit2 : TEdit;
Label3 : TLabel;
Label4 : TLabel;
Button2 : TButton;
procedure Button1Click ( Sender : TObject ) ;
private
< Private declarations >
public
< Public declarations >
end ;

var
Form1 : TForm1;

<$R *.dfm>
function proizv ( n : integer ) : integer ;
begin
if n> 0 then
proizv := sqr ( 2 * n — 1 ) * proizv ( n — 1 )
else
proizv := 1 ;
end ;
function factorial ( p : integer ) : integer ;
begin
if p> 1 then
factorial := p * factorial ( p — 1 )
else
factorial := 1 ;
end ;

procedure TForm1. Button1Click ( Sender : TObject ) ;
var summ , x : real ; n , i , p : integer ;
begin
x := strtofloat ( edit1. Text ) ;
n := strtoint ( edit2. Text ) ;
i := 1 ;
summ := 0 ;
repeat
p := 2 * i — 1 ;
summ := summ + ( proizv ( i — 1 ) / factorial ( p ) ) * power ( x , p ) ;
i := i + 1 ;
until ( i>n ) ;
label1. caption := floattostrf ( summ , fffixed , 6 , 3 ) ;

А теперь о проблеме.. Программа считает только малые порядки, у меня на n=15 программа ещё работает нормально, но при n=20 вылазиет ошибка:

arseniiv
Заслуженный участник

Как там ясно написано, вы делите на ноль.

P. S. Объявление function factorial(. ) ужасно. Переделайте по-нормальному.

— Пн сен 27, 2010 01:02:06 —

P. P. S. Остальной код не смотрел.

Elarium

Как там ясно написано, вы делите на ноль.

P. S. Объявление function factorial(. ) ужасно. Переделайте по-нормальному.

— Пн сен 27, 2010 01:02:06 —

P. P. S. Остальной код не смотрел.

Ну я попробую, но страно то, что для N y_nikolaenko

Заблокирован
y_nikolaenko
Заблокирован

Надо начать с изменения алгоритма: так ряды не суммируют.

Elarium

Надо начать с изменения алгоритма: так ряды не суммируют.

ewert
Заслуженный участник

Так и есть. Тип integer (в дельфях) — четырёхбайтовый, и как раз нуля ещё не даёт (хотя даёт, конечно, чёрт-те что вместо истинного факториала, последнее правильное значение получается для ), а , тем более — уже возвращает ноль.

Но главная проблема, конечно, в нелепости алгоритма. Во-первых, как уже было сказано y_nikolaenko , степенные ряды надо суммировать так:

(и, кстати, исходный вид разложения арксинуса гораздо приятнее для программирования, чем выражение с факториалами).

А во-вторых, нормальные люди не смешивают вычислительные и интерфейсные фрагменты в одну кучу. Какой ещё Button-то. При чём тут вообще Button. Выделите вычислительную часть в отдельную процедуру — и ссылайтесь на неё по мере необходимости.

Ну и, конечно, выводить текст программы без отступов — неприлично. Пользуйтесь тегом [ code].

Toucan
Админ форума

Если их изначально не было, то, конечно, не появятся. А если были, то теги [code] или [syntax] их покажут (в отличие от [quote] или простого текста).

(Вставил syntax в исходное сообщение).

ewert
Заслуженный участник

Нет, на 12-ти всё ещё верно, бред — с 13-ти.

Вполне пригодно, если использовать, как уже было предложено, вещественные типы (там ограничения на порядок довольно слабые). Просто нерационально по времени.

Наверное, медленно, но вовсе не крайне. В конце концов, вызов функции — всего лишь две команды типа перехода, пусть и дальнего. Плюс загон операнда в стек, но это вообще тьфу.

ewert
Заслуженный участник

Нет, не невозможен, конечно. Но что неразумен — то точно. В типичных ситуациях, и при разумных подходах к способу аппроксимации — количество членов имеет примерно тот же порядок, что и количество получаемых при этом значащих цифр.

Конкретно для арксинуса, в качестве примера. Если аргумент не превышает половинки, скажем, то шибко много членов и не понадобится. Но если он, наоборот, приближается к единичке — то использование конкретно этого ряда становится явно неадекватным. Ну и кто ж виноват, коли приспичивает его использование в неподходящей ситуации.

Страница 1 из 1 [ Сообщений: 15 ]

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей

Источник

 
Kudatsky

 
(2002-07-22 10:13)
[0]

Delphi 5 не реагирует на ошибки с плавающей точкой.

Например:

procedure TForm2.Button1Click(Sender: TObject);

Var

A,B,C:Double;

begin

Try

A:=0;

B:=1;

C:=B/A;

Caption:=FloatToStr(C);

Except

Caption:=»Ошибка»;

end;

end;

В этом примере управление не попадает в Except, а в

Caption выводится «INF».

Похоже, что-то с отладчиком ?


 
IlyaA

 
(2002-07-22 10:25)
[1]

Посмотри в доке параметры компиляции. Там есть параметр. Ругаться или нет.


 
IlyaA

 
(2002-07-22 10:26)
[2]

А с отладчиком всё в порядке. Ошибка в коде (
ГЕНЕТИЧЕСКОМ).

ИЗВИНИ. Злая шутка вырвалась наружу


 
VICTOR_

 
(2002-07-22 10:31)
[3]

Прверил, у меня Except обрабатывается. Попробуй поставить break-point на B:=1; и сделать трассировку(F7)


 
kudatsky

 
(2002-07-22 10:37)
[4]

За шутку извиню. Но только если подскажешь, какой папаметр.

Иначе буду являться по ночам угрызениями совести ;-)))


 
kudatsky

 
(2002-07-22 10:45)
[5]

Кое-что нашёл.

Если снять флажок «Integration debugging»,

Except обрабатывается.

Но в варианте

A:=0;

B:=1;

C:=B/A;

Caption:=FloatToStr(C);

появляется сообщение «Floating point division by zero», а

остановки на строке с ошибкой не происходит


 
Skier

 
(2002-07-22 11:30)
[6]

>kudatsky

Debbuger Options|Language Exceptions|Stop on Delphi Exceptions ?


 
kudatsky

 
(2002-07-22 11:44)
[7]

Опция

Debbuger Options|Language Exceptions|Stop on Delphi Exceptions

включена


 
Skier

 
(2002-07-22 11:50)
[8]

>kudatsky

Debbuger Options|General|Integrated debugging := True


 
kudatsky

 
(2002-07-22 11:56)
[9]

Опция Integrated debugging включена.


 
Skier

 
(2002-07-22 11:57)
[10]

>kudatsky

И что ? На C:=B/A; не останавливается ?


 
kudatsky

 
(2002-07-22 12:02)
[11]

Не останавливается.

В Caption выводится «INF»

Может что на страницах OS Exception или Language Exception ?


 
Skier

 
(2002-07-22 12:08)
[12]

>kudatsky

У тебя в списке Exceptions на странице OS Exception есть

Float Devide By Zero ?


 
Viewer

 
(2002-07-22 12:10)
[13]

INF — infinity (так Борланд реагирует на эти шутки)


 
kudatsky

 
(2002-07-22 12:11)
[14]

Есть.

User program:=true

Run unhandled:=true


 
IlyaA

 
(2002-07-22 13:07)
[15]

В блоке try-except попробуй-

try

a:=b/0;

except

on EDivByZero do ShowMessage(«Error»);

end;


 
kudatsky

 
(2002-07-22 13:43)
[16]

Сделал.

Исключение не возбуждается.


 
IlyaA

 
(2002-07-22 13:45)
[17]

Похоже у тебя уже всё
упало.


 
kudatsky

 
(2002-07-22 13:52)
[18]

Только-что инстолировал D5 на другую машину. То же самое. Что интересно, никакой реакции на

on E: Exception do ShowMessage(«Error»);

Может Delphi с глюками ?


 
Слесарь Матерящийся

 
(2002-07-22 13:59)
[19]

Может, дело в точности представления вещественного числа?

То есть, присваиваем чистый 0, а получаем 0 + погрешность, и в результате не-ноль.

Попробуйте то же самое с целыми числами.


 
IlyaA

 
(2002-07-22 14:01)
[20]

Вот енто из хэлпы. Может что и прояснит

EIntError is the base class for integer math error exceptions.

Unit

SysUtils

Description

EIntError is a generic integer math exception. Although it is never raised in the runtime library, it is the base from which other integer math exceptions descend. These are the integer math exceptions:

Exception Meaning

EDivByZero An attempt was made to divide by zero

ERangeError Number or expression out of range

EIntOverflow Integer operation overflowed

Run-time exception information is saved in fields provided by EExternal.


 
kudatsky

 
(2002-07-22 14:02)
[21]

С целыми числами всё в порядке, я уже пробовал.


 
Слесарь Матерящийся

 
(2002-07-22 15:11)
[22]

То-то и оно!


 
kudatsky

 
(2002-07-22 15:19)
[23]

????????????????


 
tall

 
(2002-07-22 16:00)
[24]

Я эту тему пеоднимал уже несколько раз. Кстати и в этой конфе тоже. Куда только не писал. Вразумительный ответ дали только в AMD (у меня эти глюки начались после того как пересел с Pentium 200MMX на AMD 1200. Думал может связано сплатформой). Там мне сказали, что это не глюк, а изменения в компиляторе в соответствии с требованиями новых стандартов ( типа ответ +INF или -INF (бесконечность) и тому подобное это не исключительная ситуация а нормальное явление). И отослели к технической документации по процессору( там, кстати, это действительно написано). Судя по всему это относится и Pentium платформе (мне писали об аналогичных проблемах на Celeron), т.е. характерно для всех новых процессоров. Решить эту проблему удалось только откатившись на DELPHI 4. Чего и вам советую.


 
kudatsky

 
(2002-07-23 10:27)
[25]

tall, если Вы ещё здесь!

Где это можно прочитать ?


 
VICTOR_

 
(2002-07-23 11:48)
[26]

У тебя материнка на VIA логике?


 
Viewer

 
(2002-07-23 12:24)
[27]

ffmt.asm

; INF and NAN strings

INFNAN DB «INFNAN»

; function FloatToText(Buffer: PChar; const Value; ValueType: TFloatValue;

; Format: TFloatFormat; Precision, Digits: Integer): Integer;

sysutils.pas

function TextToFloat(Buffer: PChar; var Value;

ValueType: TFloatValue): Boolean;

{ FloatToDecimal converts a floating-point value to a decimal representation

that is suited for further formatting. The Value parameter must be a

variable of type Extended or Currency, as indicated by the ValueType

parameter. For values of type Extended, the Precision parameter specifies

the requested number of significant digits in the result—the allowed range

is 1..18. For values of type Currency, the Precision parameter is ignored,

and the implied precision of the conversion is 19 digits. The Decimals

parameter specifies the requested maximum number of digits to the left of

the decimal point in the result. Precision and Decimals together control

how the result is rounded. To produce a result that always has a given

number of significant digits regardless of the magnitude of the number,

specify 9999 for the Decimals parameter. The result of the conversion is

stored in the specified TFloatRec record as follows:

Exponent — Contains the magnitude of the number, i.e. the number of

significant digits to the right of the decimal point. The Exponent field

is negative if the absolute value of the number is less than one. If the

number is a NAN (not-a-number), Exponent is set to -32768. If the number

is INF or -INF (positive or negative infinity), Exponent is set to 32767.

Negative — True if the number is negative, False if the number is zero

or positive.

Digits — Contains up to 18 (for type Extended) or 19 (for type Currency)

significant digits followed by a null terminator. The implied decimal

point (if any) is not stored in Digits. Trailing zeros are removed, and

if the resulting number is zero, NAN, or INF, Digits contains nothing but

the null terminator. }


Ok, I installed VS C++, and tried to reproduce this:

1) Open HelloCL

2) Add the line «control87(0x1332, 0xFFFF);» somewhere before the line that builds the cl program «err = program.build(devices);».  This is the default CW used in Delphi.

3) Change HelloCL_Kernels.cl to the attached code

Now when I try to build, I get the error:

«Unhandled exception at 0x007ee2e3 in HelloCLVS10.exe: 0xC000008F: Floating-point inexact result.»

If you don’t change the kernel code, it builds without an exception in both cases.

__kernel void hello(__global float4 * inval, __global float * outval) { size_t gid = get_global_id(0); float g_size = (float)get_global_size(0); outval[gid] = sin((float)gid/g_size) * length(inval[gid]) + 17.0f; }

Понравилась статья? Поделить с друзьями:
  • Ошибка float object is not callable python
  • Ошибка flash player в браузере
  • Ошибка flash player for internet explorer
  • Ошибка field is read only
  • Ошибка fl studio quickfontcache dll not found