Hint: use DIV instead to get an integer result
Реально это одно и тоже?!
FLeaderBonus:=((FStructure.Side21-FStructure.PersonalPV)*FPointPrice*3) div 100;
Мои сомнения в том, что Currency в принципе не совсем целочисленное. Будут ли актуальными значения?
Так нельзя, надо через адресный каст к 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;
Почему нельзя. Ну, в любом случае значения разные будут. Этот пример я просто привел, чтобы показать, что хинт подсказывает неправильно. В этих переменных по определению будут разные значения. Кстати, мне в багтрекере уже ответили. Баг уже исправили в этом коммите https://gitlab.com/freepascal.org/fpc/source/-/commit/09628e56cbe6ae513c2d1530514531ad6314bb0a
вот как ты показал естветственно будут разные, потому что нельзя там див применять и подсказка есесно ошибается, но если все-же применить див (что будет быстрее чем деление вещественных) то делать надо как я показал
вот что мне нравится в fpc/lazarus - это как там иногда быстро правят баги 👍
Да, нельзя. В этом суть проверки было. Окольным путем можно конечно div использовать. НАвскидку вот еще вариант (я стараюсь всегда использовать указатели только по необходимости, то есть почти никогда :) ) aCurrency2 := ((aInput*10000) div 100)/10000; Мне кажется мой вариант практичней и красивей )) В любом случае просто заменить, как было написано в hint нельзя. Поэтому я написал в багтрекер, что эту подсказку надо убрать для Currency
Но, кстати, будет ли он быстрей? aCurrency2 := ((aInput*10000) div 100)/10000; чем aCurrency1 := aInput / 100; Думаю, все таки да, быстрей. Так как несмотря на дополнительные вычисления будет испоьзоваться целочисленное деление
А если выставить агрессивную оптимизацию, то в 3 раза )
ну там даже технически не может быть ускорения, хотя надо сравнить с интеловским компилером, он умеет делать хитрые оптимизации заменяя матвыражения их аналогами и битовыми сдвигами :)
Обсуждают сегодня