169 похожих чатов

Есть формула: FLeaderBonus:=(FStructure.Side21-FStructure.PersonalPV)*3/100*FPointPrice; где все переменные Currency. Итак. КОгда я компилирую, появляется подсказка: bonuscalc.pas(544,66)

Hint: use DIV instead to get an integer result

Реально это одно и тоже?!
FLeaderBonus:=((FStructure.Side21-FStructure.PersonalPV)*FPointPrice*3) div 100;

Мои сомнения в том, что Currency в принципе не совсем целочисленное. Будут ли актуальными значения?

8 ответов

31 просмотр

Так нельзя, надо через адресный каст к Int64 и обратно. Например вот так ошибки не будет procedure TestCurrency; var aCurrency1, aCurrency2, aInput: Currency; aTemporaryInt: Int64; begin aInput := 12; aCurrency1 := aInput / 100; aTemporaryInt := PInt64(@aInput)^; aTemporaryInt := aTemporaryInt div 100; aCurrency2 := PCurrency(@aTemporaryInt)^; if aCurrency1 <> aCurrency2 then raise Exception.Create('Error'); end;

Renat-Suleymanov Автор вопроса
Александр (Rouse_) Багель
Так нельзя, надо через адресный каст к Int64 и обр...

Почему нельзя. Ну, в любом случае значения разные будут. Этот пример я просто привел, чтобы показать, что хинт подсказывает неправильно. В этих переменных по определению будут разные значения. Кстати, мне в багтрекере уже ответили. Баг уже исправили в этом коммите https://gitlab.com/freepascal.org/fpc/source/-/commit/09628e56cbe6ae513c2d1530514531ad6314bb0a

Renat Suleymanov
Почему нельзя. Ну, в любом случае значения разные ...

вот как ты показал естветственно будут разные, потому что нельзя там див применять и подсказка есесно ошибается, но если все-же применить див (что будет быстрее чем деление вещественных) то делать надо как я показал

Renat Suleymanov
Почему нельзя. Ну, в любом случае значения разные ...

вот что мне нравится в fpc/lazarus - это как там иногда быстро правят баги 👍

Renat-Suleymanov Автор вопроса
Александр (Rouse_) Багель
вот как ты показал естветственно будут разные, пот...

Да, нельзя. В этом суть проверки было. Окольным путем можно конечно div использовать. НАвскидку вот еще вариант (я стараюсь всегда использовать указатели только по необходимости, то есть почти никогда :) ) aCurrency2 := ((aInput*10000) div 100)/10000; Мне кажется мой вариант практичней и красивей )) В любом случае просто заменить, как было написано в hint нельзя. Поэтому я написал в багтрекер, что эту подсказку надо убрать для Currency

Renat-Suleymanov Автор вопроса
Renat Suleymanov
Да, нельзя. В этом суть проверки было. Окольным пу...

Но, кстати, будет ли он быстрей? aCurrency2 := ((aInput*10000) div 100)/10000; чем aCurrency1 := aInput / 100; Думаю, все таки да, быстрей. Так как несмотря на дополнительные вычисления будет испоьзоваться целочисленное деление

Renat-Suleymanov Автор вопроса

А если выставить агрессивную оптимизацию, то в 3 раза )

Renat Suleymanov
А если выставить агрессивную оптимизацию, то в 3 р...

ну там даже технически не может быть ускорения, хотя надо сравнить с интеловским компилером, он умеет делать хитрые оптимизации заменяя матвыражения их аналогами и битовыми сдвигами :)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта