Показать полную графическую версию : acos: DOMAIN ERROR
0_5Mandarinki
05-08-2008, 01:48
Всем здравствуйте!
В моей программе (borland c++) u находится следующим образом:
x = StrToFloat(Edit1->Text);
u = acos(x);
и exe-шик выдает ошибку: acos: DOMAIN ERROR
math.h подключена, область определения acos [-1;1]. Подозреваю, что дело тут в том, что для acos x должно быть типа double. Но как перевести float x в double x? Или как сделать так, чтобы x сразу считывалось как double?
А какие ты числа вводишь в Edit1?
Вот такой вот код прекрасно работает при числах -1..1:
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double x = StrToFloat(Edit1->Text);
double u = acos(x);
Edit2->Text = FloatToStr(u);
}
//---------------------------------------------------------------------------
0_5Mandarinki
05-08-2008, 14:21
5pliT, спасибо за ответ.
Ваш код работает. Но в моей программе все равно выдается та же ошибка. В ней я считываю х, подставляю его в формулу double z = f(x), а потом беру acos(z). Провожу проверку того, что z из [-1;1] :
if(z>1 || z<-1){Edit9->Text = FloatToStr(z);};
exe-файл в Edit9 пишет 1! Но неравенство-то строгое. Т.е. он почему-то считает что значение 1, которое принимает z строго больше 1, а потому и не может посчитать арккосинус.
У кого-нибудь есть идеи почему он себя так странно ведет?
Чтобы все работало было просто дописано:
if(z>1){ z=1;};
if(z<-1){z=-1;};
Но все же интересно, как сделать так, чтобы все работало "честно"?
Както не нравится мне ваша проверочка, поробуйте лучше такую:
x>=-1.0 && x<=1.0
Delirium
05-08-2008, 16:12
А если вы введете в EditBOx букву, как ваша программа будет работать? Вылетит в exception? Я бы вашем месте предварительно делал проверку на соответствие типа (вроде isDouble) вводимых данных, в случае положительного ответа уже плясал бы дальше. А то, может вы вводите число, а оно конвертируется функцией неверно? Может, конечно, я сильно привык к C#, но конструкция double x = StrToFloat довольно странна. Float и Double все таки разные типы данных.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.