Страница 1 из 1

Выдаёт ошибку: Acos Domain Error,полсе нажатия окей,ещё одну ошибку pow

Добавлено: 09 апр 2009, 22:44
prikolist
Здравствуйте! подскажите пожалуйста где ошибка в коде.

Выдаёт ошибку: acos DOMAIN error,полсе нажатия окей,ещё одну ошибку
pow OWERFLAW ERROR

Вот код программы:

Код: Выделить всё

//---------------------------------------------------------------------------


#include <vcl.h>
#include <math.h>   // Директива для sqrt,abs,pow
#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)
{
float a,b,c,h,otvet;
double d;



//Выводим результат в Label1  проверив на исключения
try
{
//Присваиваем переменным а,b,c,d,h введённые значения. в Edit1..Edit5
//Преобразуем с текстового типа символы в вещественый тип Float
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
c = StrToFloat(Edit3->Text);
d = StrToFloat(Edit4->Text);
h = StrToFloat(Edit5->Text);

//Результат вычислений присваиваем переменной "otvet"  проверив деление
// на значение b
if (b!=0)
{
otvet = pow(4*(exp(sqrt(abs(a/b)))-exp(-sqrt(abs(a/b))))+3*acos(d),c);
return;
}
else
{
MessageBox(0,"Введите другое значение b и повторите расчет, так как делить \n на b, при b=0 запрещенно, согласно законам программирования !",
"Программа создана Игорем",MB_ICONWARNING);
return;
}



//-----------------------------------------------------------




//Результат пполучаем в метке Label 1
Label1->Caption = "Результат=" + FloatToStrF(otvet,ffGeneral,7,2);
}
catch(EZeroDivide&)
{
MessageBox(0,"Ошибка! Деление на ноль!!!","Ошибка",MB_ICONERROR);
return;
}
catch(EConvertError&)
{
MessageBox(0,"Ошибка! Неправильно введено число в одном из \n полей. Возможно в полях присутствуют неправильные \n знаки вроде: w,п,!,%,$,. и т.д.","Ошибка",MB_ICONERROR);
return;
}
catch(EOverflow&)
{
ShowMessage("Выход числа за допустимый диапазон");
return;
}

}
//---------------------------------------------------------------------------
//Кнопка закрыть
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();

Re: Выдаёт ошибку: Acos Domain Error,полсе нажатия окей,ещё одну ошибку pow

Добавлено: 10 апр 2009, 11:06
Romeo
Чтобы решить эти проблемы не нужно знать программирование вовсе. Достаточно знаний математики. Подчеркну, именно математики! Это не "закон программирования", как указано у тебя в тексте ошибки :)

Область определения арккосинуса = [-1, 1]. При введении друго значения для d получишь ошибку.

Область определения математического возведения в степень, описывается несколько более сложно, но в её основе лежат всё те же основы вычислительной арифметики (как-то: делить на ноль нельзя и т.д.). Вот описание функции pow.

Код: Выделить всё

Функция pow возвращает значение x в степени y. Если y равна
0, pow возвращает значение 1. Если x равно 0 и y отрицательная,
pow устанавливает errno в ERANGE и возвращает HUGE. Если x отри-
цательное, а y не является целой, функция печатает сообщение об
ошибке DOMAIN в stderr, устанавливает errno в ERANGE и возвращает
либо положительное, либо отрицательное значение HUGE. В случае
переполнения или потери значимости никакого сообщения не печата-
ется. См.также exp, log, sqrt.

Re: Выдаёт ошибку: Acos Domain Error,полсе нажатия окей,ещё одну ошибку pow

Добавлено: 10 апр 2009, 12:04
prikolist
Про pow я знаю, и что нужно прописывать модуль маз при использовании математич. выражений. Исправьте пожалуйста проблемму?

Re: Выдаёт ошибку: Acos Domain Error,полсе нажатия окей,ещё одну ошибку pow

Добавлено: 10 апр 2009, 12:13
Romeo
Погоди-ка, у тебя всё уже на блюдечке выложено. Детально описана одна функция и строго указано область определения другой функции. Умение работать самостоятельно - обязательный навык для любого программиста. Будем этот навык воспитывать: пробуй исправить код самостоятельно, иначе перенесу в "Решите мне задачку".

P.S. Маленькая наводка: значение b ты проверяешь на то, что оно не равно ноль. Почему не проверяешь значение d, что d попадает в область определения арккосинуса? Дальше думай сам.