Invalid floating point operation как исправить cutting

 
Petrovski
 
(2006-10-16 17:22)
[0]

Источником информации через ADODataSet является хранимая процедура. При отображении/прокрутке информации в сетке появляется вышеуказанное сообщение. В самой процедуре из того, что могло бы влиять на ситуацию — умножение/деление смешанных целых и дробных значений. Может кто сталкивался с подобной ситуацией или знает, где искать причину ошибки?


 
ANB ©
 
(2006-10-16 17:23)
[1]

Неправильная операция на числом с плавающей точкой.


 
clickmaker ©
 
(2006-10-16 17:24)
[2]

Например, пытаешься из поля типа float получить целое (AsInteger)


 
Stanislav ©
 
(2006-10-16 17:32)
[3]

Я с такой фигней сталкивался, когда запускал приложение под некоторыми win98, на XP было все ок!
Спасало обновление MDAC, либо копирование папки
Program FilesCommon FilesSystem
с рабочей win98 на нерабочую, когда это непомогало, спасала переустановка винды :-)


 
ANB ©
 
(2006-10-16 17:39)
[4]

Проверь типы полей в наборе данных. Скорее всего неправильно определились.


 
clickmaker ©
 
(2006-10-16 18:11)
[5]


> спасала переустановка винды

ну-ну. «Если в кране нет воды, то виной тому — Винды» :)


 
Petr V.Abramov
 
(2006-10-17 01:12)
[6]

это глюк, который м.б. от чего угодно, лечится патчами ADO, windows, программы

> clickmaker ©   (16.10.06 18:11) [5]
 если глючит монитор — микрософт развертку спер
 счет пришел за интернет — вот от микрософта вред :)


 
Stanislav ©
 
(2006-10-17 08:36)
[7]

>clickmaker ©   (16.10.06 18:11) [5]
:-)
Не исключино что комп был заражен червем, может он чего-то наделал.
Разбираться небыло времени, быстрее было винду переставить.


 
ANB ©
 
(2006-10-17 13:03)
[8]


> лечится патчами ADO, windows, программы

и мозгов :)


 
Petrovski
 
(2006-10-17 13:21)
[9]

Никаких видимых нарушений в определении полей не нашел — поля типа Curency  из MS SQL передаются как BCDField, Integer — как IntegerField.
Удалось локализовать источник ошибки. Это вычисляемое поле, в котором  одно BCDField делилось на другое BCDField и умножалось на 100, причем только в том случае, если в числителе был 0.
Почему так — не понимаю.
Спасибо всем за соучастие.


 
ANB ©
 
(2006-10-17 13:34)
[10]


> Petrovski   (17.10.06 13:21) [9]

Вот это уже ближе.
1) Перенеси вычисления на сервер.
2) Имхо — у тебя там и в знаменателе 0. Поставь проверку — если ноль в числителе, то не считать ничего, сразу ноль писать (case).


 
Petrovski
 
(2006-10-17 13:59)
[11]

> ANB [10]

Спасибо!
Я, собственно, и сделал по второму варианту. (Нулей в знаменателе нет). Сейчас попробую и первый вариант реализовать.


DTioutiou

slasher

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже.

Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Button1: TButton;
    Edit9: TEdit;
    Edit10: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  dHandle : THandle;
implementation
 
{$R *.dfm}
 function SSS (AB,DC,S1,S2,BD:real;H,x1,x2,x3,y1,y2,y3,x4,y4:integer):real;
external 'dll3.dll';
 
procedure TForm1.Button1Click(Sender: TObject);
var
AB,DC,S1,S2,BD,d:real;
H,x1,x2,x3,y1,y2,y3,x4,y4:integer;
SSS: function(AB,DC,S1,S2,BD:real;H,x1,x2,x3,y1,y2,y3,x4,y4:integer):real; stdcall;
begin
@SSS:=nil;
dHandle:=LoadLibrary('dll3.dll');
 if dHandle<>0 then
    begin
    @SSS:=GetProcAddress(dHandle,'SSS');
    if @SSS<>nil then
          begin
          x1:=StrToInt(edit1.Text);
y1:=StrToInt(edit2.Text);
x2:=StrToInt(edit3.Text);
y2:=StrToInt(edit4.Text);
x3:=StrToInt(edit5.Text);
y3:=StrToInt(edit6.Text);
x4:=StrToInt(edit7.Text);
y4:=StrToInt(edit8.Text);
D:=SSS(AB,DC,S1,S2,BD,H,x1,x2,x3,x4,y1,y2,y3,y4); \ Пишет что здесь ошибка "invalid floating point operation"
Edit9.Text:=FloatToStr(S1);
Edit10.Text:=FloatToStr(S2);
end
  else
          begin
           ShowMessage('ошибка.Функция не найдена в DLL');
          Exit;
          end;
     FreeLibrary(dHandle);
    end
    else
    begin
       ShowMessage('Ошибка.Библиотека не найдена');
      Exit;
    end;
end;
 
end.

Здравствуйте! 

Часто начала появляться ошибка «invalid floating point operation», обычно закрывается нажатием кнопки «ОК». Ошибка появляется при заполнении/редактировании сметы.

Не могу понять причину появления ошибки и её связь с какими либо действиями. Иногда совсем не появляется. Иногда появляется один раз и закрывается  нажатием кнопки «ОК». А иногда появляется окно с ошибкой, при нажатии на кнопку «ОК» ошибка закрывается и тут же появляется это же окно с ошибкой, далее программу приходится закрывать из диспетчера задач.

А иногда, после нескольких появлений вышеуказанной ошибки, РИК самостоятельно закрывается без каких либо сообщений.

Подозреваю что, что-то не так с системой, так как на другом компе проблем не возникает.

Система Win10, ошибка начала появляться после последнего крупного обновления винды за май 2020.

Если кто знает решение данной проблемы, будьте добры, помогите пожалуйста… усталлл

Ошибка РИК.png

Код на Delphi. После запуска ввожу в поле значение для H (с запятой, т.к вещественное число), запускаю сию процедуру. Выскакивает ошибка «Invalid floating point operation». Помогите найти, пожалуйста.

procedure TForm1.Button1Click(Sender: TObject);
const
  Xmin = -3.0;
  Xmax = 3.0;
var
  W, y, H, x: real;
  i: integer;
begin
  i := 1;
  x := Xmin;
  Series1.Clear;
  H := StrToFloat(Edit1.Text);
  StringGrid1.Cells[0, 0] := 'x';
  StringGrid1.Cells[1, 0] := 'W';
  StringGrid1.Cells[2, 0] := 'y';
  repeat
    if ((x > 0.1) and (x < 2.0)) then
      W := ln(x) + Exp((1 / 3) * ln(x))
    else if (x <= 0.1) then
      W := 4 * x + Exp(2 * ln(Sin(x)))
    else
      W := 2.6 * Exp(2 * ln(x) - 3.7);
    y := (ln(Exp(2*ln(W)) + W + 1) * cos(4 * x)) / (Exp(-2) + 2);
    Series1.AddXY(x, y);
    StringGrid1.Cells[0, i] := FloatToStr(y);
    StringGrid1.Cells[1, i] := FloatToStr(W);
    StringGrid1.Cells[2, i] := FloatToStr(x);
    x := x + H;
    i := i + 1;
  until x >= Xmax;
end;

Понравилась статья? Поделить с друзьями:
  • Как найти фокус объектива
  • Как найти похожий файл в интернете
  • Как найти коэффициент силы трения через ускорение
  • Как найти смещение в процессе
  • Как найти размер документа