Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
zardram
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 19
#1

Power, или как игнорировать все и вся

05.06.2015, 10:14. Просмотров 360. Ответов 11
Метки нет (Все метки)

Всем доброго времени суток
В общем дело такое: пишу прогу довольно хорошего масштаба и, вроде как, все хорошо, но тут я заметил, что что-то не так и, как оказалось, меня поимели.
Есть функция:
Название: image100.gif
Просмотров: 15

Размер: 592 байт

Я написал ее следующим образом:
Delphi
1
1/( 0.67 + 0.1*Power(f,1/2) + 0.34*Power(f,1/3) )
Значение f = 0.56 (там оно высчитывается спустя три километра программного кода, но высчитывается верно, как ни странно). Получается, что значение функции должно быть = 0.98~, но выходит лишь 0.901~

Заметил, что проблема кроется в последнем качке, а именно:
Power(f,1/3) //тут значение получается не 0.82~, а просто тупо 1, причем полностью игнорирует функцию RoundTo

Эту фигню я пишу в отдельном модуле, внутри одной большой функции (в ней ищется куча всяких коэффициентов, среди которых и этот(единственный неверно высчитываемыйся)), а когда запихиваю на какую-нибудь из форм и по кнопке вызываю результат, то пишет адекватно. Даже когда вытаскиваю эту функцию в тело функции-папы, то считает адекватно.

Структура функции-папы такая:
Delphi
1
2
3
4
5
6
7
8
function papa(a,s,d,g,h...:extended):extended
function z(f: extended):extended;
begin
if f < 100 then z := 1/( 0.67 + 0.1*Power(f,1/2) + 0.34*Power(f,1/3) );
end;
begin
papa := a+f+k+l/x+c+v+m;
end;
Вот такая вот фигня. В чем может быть проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2015, 10:14
Ответы с готовыми решениями:

Как игнорировать ошибки?
Доброго времени суток. При нажатие на кнопку дельфи удаляет строку из БД он...

Как игнорировать заданные символы?
помогите транслитом как игнорировать эти символы ? '`': '`': '': ';': ''':...

Как заставить Tchromium игнорировать ошибки WebGL
Привет. Игрушка содержит webgl (это я знаю так как в Яндекс браузер на него...

Как узнать, что вся дата в MaskEdit введена полностью
Здравствуйте! Есть MaskEdit, у него стоит маска ввода даты, пример 12/12/2009....

Как вы организуете юниты? По папкам или все сплошняком?
Народ, всем привет! Как Вы организуете юниты? Вот пишу я компонент и чем дальше...

11
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
05.06.2015, 10:51 #2
Сейчас проверил в Delphi 7.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
uses
  Math;
 
function Z(const f: Extended) : Extended;
begin
  Result := 1/( 0.67 + 0.1*Power(f, 1/2) + 0.34*Power(f, 1/3) );
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Z(0.56) = ' + FloatToStr(Z(0.56))
    + #13#10 + 'Power(0.56, 1/3) = ' + FloatToStr(Power(0.56, 1/3)));
end;
Получилось вот что:
- Функция Z(0.56) возвращает значение: 0.975533095...
- Значение выражения Power(0.56, 1/3): 0.824257059...
Название: 01.png
Просмотров: 18

Размер: 9.9 Кб
0
zardram
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 19
05.06.2015, 10:53  [ТС] #3
Ну все правильно, а у меня отказывается подчиняться
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
05.06.2015, 10:58 #4
zardram, а если в твоей программе попробовать запустить только то, что у меня в посте показано - прямо в таком виде, отдельно от всего остального, то что программа покажет?

Добавлено через 1 минуту
Если опять будет неверный результат, предлагаю создать чистый пустой проект, скопировать в него проверочный код и запустить. - Что покажет?
0
zardram
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 19
05.06.2015, 11:00  [ТС] #5
Правильно все показывает, в этом-то и соль

зы: у меня правильно только если я пишу
Delphi
1
2
3
4
5
6
7
8
function papa(a,s,d,g,h...:extended):extended
function z(f: extended):extended;
begin
if f < 100 then z := ROUNDTO( 1/( 0.67 + 0.1*Power(f,1/2) + 0.34*Power(f,1/3) ),-2);
end;
begin
papa := a+f+z(f)+k+l/x+c+v+m;
end;
но писать округление буквально в каждой строчке - это не будет выглядеть круто...
Я округляю только результат самой функции, а не само решение, результат которой потом принимает функция, т.к. так хоть код более-менее смотрибельный
Delphi
1
2
3
4
5
6
7
8
9
10
11
function papa(a,s,d,g,h...:extended):extended
function z(f: extended):extended;
begin
if f < 100 then z := ROUNDTO( 1/( 0.67 + 0.1*Power(f,1/2) + 0.34*Power(f,1/3) ),-2);
end;
var
sas: extended;
begin
sas := RoundTo(z(f),-2);
papa := a+f+k+l/x+c+v+m;
end;
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
05.06.2015, 11:03 #6
Цитата Сообщение от zardram Посмотреть сообщение
Правильно все показывает, в этом-то и соль
Это в каком случае? В новом проекте или в прежнем проекте через проверочный код?
0
zardram
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 19
05.06.2015, 11:04  [ТС] #7
В прежнем (в новом-то всегда все правильно )
0
northener
пофигист широкого профиля
3418 / 2318 / 630
Регистрация: 15.07.2013
Сообщений: 13,700
05.06.2015, 11:05 #8
Цитата Сообщение от zardram Посмотреть сообщение
papa := a+f+k+l/x+c+v+m;
И где в папе учитывается результат той функции?
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
05.06.2015, 11:08 #9
Можно ещё по шагам идти и смотреть значения. Кстати, оптимизацию в проекте надо отключить: Projects - Options... - вкладка Compiler:
- Optimization - убрать отметку.
- Debug information - поставить отметку.
После этого полностью перекомпилировать проект.
0
zardram
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 19
05.06.2015, 11:10  [ТС] #10
Ну, допустим, я ее в переменную k забиваю
Да и дело не в этом (я от фонаря папу накидал), просто интересно, почему Повер сам округляет, как ему вздумается... он же должен возвращать плавающую точку, если она имеется
добавка: я понятия не имею, что произошло, но все внезапно посчиталось нормально (я даже код не изменял, не считая комментарии, в которых я свой мозг уже прожег)

Добавлено через 1 минуту
хотя нет, вру, не помогло (
Но, тем не менее, проблема просто сама собой испарилась и я теперь вдвойне ни черта не понимаю
0
Mawrat
12824 / 5732 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
05.06.2015, 11:17 #11
zardram, оптимизацию отключил? Отключи. В режиме оптимизации больше вероятность глюков.

Добавлено через 30 секунд
И отладку следует всегда проводить с отключенной оптимизацией.
0
zardram
0 / 0 / 0
Регистрация: 18.05.2015
Сообщений: 19
05.06.2015, 11:20  [ТС] #12
Отключена была, а я ее зачем-то включил после твоего поста )
В ХЕ она, по-моему, по дефолту отключена

Добавлено через 1 минуту
В общем я ни черта не понял, но проблема исчезла, все считает нормально
было:
Delphi
1
2
3
4
5
6
7
8
function z_m1(f: Extended): Extended;
  begin
    if ( f < 100 )
      then
        z_m1 := 1/( 0.67+0.1*Power(f,1/2)+0.34*Power(f,1/3) )
      else
        z_m1 := 1.47 / Power(f,1/3);
  end;
стало:
Delphi
1
2
3
4
5
6
7
8
function z_m1(f: Extended): Extended;
  begin
    if ( f < 100 )
      then
        Result := 1/( 0.67+0.1*Power(f,1/2)+0.34*Power(f,1/3) )
      else
        Result := 1.47 / Power(f,1/3);
  end;
0
05.06.2015, 11:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2015, 11:20

Как проверить все ли ячейки в StringGrid заполнены или нет ?
Здравствуйте, уважаемые форумчане. Решаю задачу: Формируется массив из 10...

Перехват ошибки, или как деактивировать все едиты одновременно
на форме есть лукапкомбобокс и много много эдитов, есл не трогая его попытаться...

Игнорировать ошибки и продолжать читать код в блоке try или как то еще
Так как не смог сделать то, о чем спрашивал тут , решил заняться &quot;порнографией&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru