Сообщение от Puporev
Код Delphi
1
2
b1:=Sqrt(DfX1); нахожу квадратный корень
b2:=Sqrt(DfX2);
Здесь при определенных значениях х, под корнем получается отрицательное число.
Если числа вводятся безконтрольно, то в этом случае можно выдавать предупреждение
Код Delphi
1
2
if DfX1<0 then showmessage(‘Подкоренное выражение меньше ноля’) else b1:=Sqrt(DfX1);
Да вы правы числа вводятся безконтрольно, вот вся программа
Delphi | ||
|
т.е мне ненужно выводить сообщение о том что число под корнем отрицательное, оно должно считаться и сравниваться с Эпсилонтом в DfX2 значение все равно отрицательное и как его посчитать не знаю.
А решаю задачу многомерной оптимизации состоящую из 7 шагов
1- ввожу X1,X2;
2- нахожу их значения в функции F(X1,X2) у меня
Delphi | ||
|
A1:=Fvek+Fvek2; получаю значение функции
3-нахожу производную для X1,X2
Delphi | ||
|
4-нахожу новый X1,X2 подставл производную в формулу
X1:=X1-L*DfX1;
X2:=X2-L*DfX2;
5-нахожу их значения в функции F(X1,X2) уже с новыми X1,X2
Delphi | ||
|
6-проверяю A1 и A2 если A1 >A2 тогда идем дальше если нет то цикл должен выполниться еще раз и уменьшить шаг т.е L:=L/2 это я в коде еще не реализовал
7—нахожу новые производные для X1,X2
Delphi | ||
|
и пытаюсь впихнуть их в корень
Delphi | ||
|
проверяю условием
sum > Eps то выполняем еще иначе получаем долгожданный ответ.
I keep getting this error «Invalid Floating Point Operation».
I’m on Delphi 7.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
TlHelp32, Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls;
var //global
PHandle, cancel, bytes, scantype: integer;
…
procedure Tmain.scanbtnClick(Sender: TObject);
var max, address: Integer;
floatinput, floatinput1, floatinput2, datafloat: Real;
x: cardinal;
itm: TListItem;
begin
floatinput := StrToFloat(Trim(valueinput.Text));
floatinput1 := StrToFloat(Trim(valueinput1.Text));
floatinput2 := StrToFloat(Trim(valueinput2.Text));
if floatinput2 < floatinput1 then
begin
floatinput1 := floatinput1 + floatinput2;
floatinput2 := floatinput1 - floatinput2;
floatinput1 := floatinput1 - floatinput2;
end;
result.Show;
x := 0;
address := 0;
result.resultlist.Clear;
repeat
Application.ProcessMessages;
statusbar1.Panels.Items[1].Text := 'Searching... ' + IntToStr(address * 100 div max) + '% (' + IntToStr(address div bytes) + ' out of ' + IntToStr(max div bytes) + ').';
if ReadprocessMemory(PHandle, Ptr(address), @datafloat, bytes, x) then
begin
if (x > 0) then
begin
if scantype = 0 then
begin
if datafloat = floatinput then //error here
begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
if scantype = 1 then
begin
if datafloat > floatinput //also here
then begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
if scantype = 2 then
begin
if datafloat < floatinput //here too
then begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
if scantype = 2 then
begin
if (dataint <= intinput2) and (dataint >= intinput1) //even here
then begin
itm := result.resultlist.Items.Add;
itm.Caption := '0x' + IntToHex(address,8);
itm.SubItems.Add(FormatFloat('0.0#########', datafloat));
end;
end;
end;
end;
if x <> 0
then address := address + x
else address := address + bytes;
until (address >= Max) or (cancel = 1);
end;
I even checked on the cpu window, and it happens because its trying to load a floating point value from a pointer that is pointing at a null value.
It’s not the ReadMemory, because this little piece of code is on a while loop and it returns several valid values before running into this error.
What should I do?
Thanks in advance.
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
… (продолжение следует) …
Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Ошибка при выполнении FloatToStr
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Junior Рейтинг (т): нет |
Имеем q:extended и s:string. При попытке выполнить s:=FloatToStr(q) вылетает «invalid floating point operation». При этом q имеет значение 0.0275. Ничего не понимаю. Пробовал менять значения, скажем на q:=0.1, ошибка все равно вылетает. |
RusSun |
|
Full Member Рейтинг (т): 6 |
procedure TForm1.Button1Click(Sender: TObject); var q:extended; s:string; begin q:=0.0275; s:=FloatToStr(q); Edit1.text:=s; end; попробуй помеять точку на запятую ? Добавлено 07.09.12, 02:55 |
Sandy |
|
Junior Рейтинг (т): нет |
Цитата RusSun @ 07.09.12, 02:54 попробуй помеять точку на запятую ? Попробовал DecimalSeparator:=’,’ (и с точкой тоже) — не помогло. |
MBo |
|
Не исключено, что ошибка случилась раньше, и в стеке сопроцессора мусор. И стоит проверить перед операцией Get8087CW |
leo |
|
Да, видимо где-то раньше «затесалось» деление 0/0 или операция с неинициализированным вещ.числом (или неумелое использование встроенного asm’а для fpu-вычислений) |
Sandy |
|
Junior Рейтинг (т): нет |
Покопался в SysUtils. Получилась примерно такая цепочка: Цитата MBo @ 07.09.12, 04:44 И стоит проверить перед операцией Get8087CW Спасибо, почитаю хелп только. |
leo |
|
Копаться в FloatToStr бесполезно, т.к. она работает нормально. Сообщение отредактировано: leo — 07.09.12, 08:02 |
Sandy |
|
Junior Рейтинг (т): нет |
Цитата leo @ 07.09.12, 08:00 Копаться в FloatToStr бесполезно, Да, так и получилось. После прочтения одной статьи вставил Set8087CW(Get8087CW or $0100). На несколько проходов хватало. После чего опять появлялась ошибка. Цитата MBo @ 07.09.12, 04:44 Не исключено, что ошибка случилась раньше, и в стеке сопроцессора мусор. Точно. В куске кода, выдранном из старой программы, обнаружилась пара инструкций IF, использующих две объявленных, но не инициализированных переменных. Всем спасибо! |
Lumen |
|
Я обычно FormatFloat использую для преобразования числа с плавающей точкой в строку. Заодно сразу и кол-во знаков после запятой указать можно.
s:=FormatFloat(‘0.00’, q); |
Dimonka |
|
Обычно такие вещи случаются при использовании библиотек с MMX-ом. Например Graphics32. В таких библиотеках обычно пишут, как и после чего переключаться снова на FP. |
antonn |
|
Dimonka
asm emms end; так обычно сама библиотека и следит |
Sandy |
|
Junior Рейтинг (т): нет |
Цитата Lumen @ 07.09.12, 10:52 Я обычно FormatFloat использую для преобразования числа с плавающей точкой в строку. Хм… А на что можно использовать необычно? Это не сарказм, вопрос в целях повышения повышаемости. Цитата Lumen @ 07.09.12, 10:52
s:=FormatFloat(‘0.00’, q); Кажись наоборот, формат указывается после переменной. |
Filka |
|
Senior Member Рейтинг (т): 144 |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0327 ] [ 16 queries used ] [ Generated: 9.02.23, 20:23 GMT ]