Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   acos: DOMAIN ERROR (http://forum.oszone.net/showthread.php?t=113360)

0_5Mandarinki 05-08-2008 01:48 868028

acos: DOMAIN ERROR
 
Всем здравствуйте!

В моей программе (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?

5pliT 05-08-2008 08:01 868103

А какие ты числа вводишь в 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 868488

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;};

Но все же интересно, как сделать так, чтобы все работало "честно"?

5pliT 05-08-2008 15:57 868592

Както не нравится мне ваша проверочка, поробуйте лучше такую:
x>=-1.0 && x<=1.0

Delirium 05-08-2008 16:12 868600

А если вы введете в EditBOx букву, как ваша программа будет работать? Вылетит в exception? Я бы вашем месте предварительно делал проверку на соответствие типа (вроде isDouble) вводимых данных, в случае положительного ответа уже плясал бы дальше. А то, может вы вводите число, а оно конвертируется функцией неверно? Может, конечно, я сильно привык к C#, но конструкция double x = StrToFloat довольно странна. Float и Double все таки разные типы данных.


Время: 18:27.

Время: 18:27.
© OSzone.net 2001-