Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Калькулятор

Страницы: 1
Калькулятор
Задача вроде простая, но есть трудность - точность вычислений при работе калькулятора. Бывают случаи, когда необходимо осуществить операцию, в которой первый операнд целого типа, а второй - вещественного и наоборот.При выполнении преобразований данных из вещественного типа в целый дробная часть либо откидывается либо округляется. Следовательно - получаем неточное значение искомой переменной после выполнения операции. Какой код нужно прописать, чтобы решить эту проблему?
Что-то я уже плохо соображаю, а зачем вещественное приводить к целому типу и отбрасывать дробную часть. Понятно, что из-за этого будет ошибка. А вообще, округления в delphi, да и в любом паскале плохо реализованы. Например, есть такая странная вещь.
Код
x:=round(0.5); //здесь x=0
x:=round(1.5); //здесь x=2


Так, что калькулятор это программа не самая простая. Но тема хорошая, мне бы тоже очень хотелось узнать как можно повысить точность вычисления.
Цитата
Paulie пишет:
Бывают случаи, когда необходимо осуществить операцию, в которой первый операнд целого типа, а второй - вещественного и наоборот.При выполнении преобразований данных из вещественного типа в целый дробная часть либо откидывается либо округляется.

Лучше все делать в вещественном типе, а не в целом. Тогда точность останется, а перевести - успеть можно всегда.
Артём
Чтобы делать правельные округления на паскале можно использовать, например, такой код
Код
Round(Trunc(x+0.5))
Цитата
Артём Кулинич пишет:
А вообще, округления в delphi, да и в любом паскале плохо реализованы.

Это не "плохо реализованно", это так называемое "банковское округление", когда число вида x.5 окргуляется вниз, если x - четное, и вверех - если нечетное.
И все-таки, самое просто что можно сделать, так это складывать все в вещественных, как уже было предложено ранее. Тогда точность, по идее, должна будет быть на высоте.
Вот кому интересно простенький калькулятор, если надо что-то сложнее, пишите =)

Код
Program kalkulator;
Var a,c: real;
b: char;
Begin
Write('Первое число:');
readln (a);
Write ('Введите знак');
readln (b);
Write ('Второе число');
readln (c);
case b of
'+': a:=a+c;
'-': a:=a-c;
'*':a:=a*c;
'/':a:=a/c;
end;
Write ('Результат:',a);
End.


smile;-)
Часто проблемы с округлением могут решаться за счет установки проверки того, лежит ли некоторое число в некотором диапазоне. Иначе, логические условия могут получаться неверными из-за округления, а так получается все нормально.
Accende lumen sensibus, infude ainorem corbidus!
Paulie, проще всего взять одинаковые типы переменных и не морочить голову с переходами из одного типа в другой. Если нужно поточнее высчитать возьмите просто тип переменной который учитывает большее количество знаков после запятой.
пока ты не доволен жизнью - она проходит...
Цитата
a9d пишет:
Paulie, проще всего взять одинаковые типы переменных и не морочить голову с переходами из одного типа в другой. Если нужно поточнее высчитать возьмите просто тип переменной который учитывает большее количество знаков после запятой.

+1 Работать в таком случае только с вещественными типами данных, вывод округляй или форматируй как тебе требуется.
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)