
Алексей
07.10.2018
16:39:53
Спасибо!

Ioann V
07.10.2018
21:09:18
У меня, выходит, что 0.5 * 0.5 == 0.25, и потому, в C++ с полной поддержкой IEEE754, мы можем писать так:
float a = 0.5;
if(a*a == 0.25).....
кто что скажет против такого сравнения и САМОЕ ГЛАВНОЕ - ПОЧЕМУ?

Igor
07.10.2018
21:11:09
Тебе непонятно почему подобное слегка недопустимо?

Google

Igor
07.10.2018
21:11:32
Потому что типа представление не вмещается в 4 байта
да и в 8 байт
там всегда будет погрешность

Ioann V
07.10.2018
21:11:53
Ты.. эмм....понимаешь что в моем примере
в МОЕМ примере, все вмещается и речь не о общем случае?

Rabu
07.10.2018
21:13:18
лучше if(a*a == .5*.5)

Igor
07.10.2018
21:14:10
А чем лучше
Я его вопрос вообще не понял

Ioann V
07.10.2018
21:14:23

Rabu
07.10.2018
21:14:52
.1 + .2 = 0.3000000000000000004 знакомо?

Крис
07.10.2018
21:15:09
Прочитайте внимательно что пишет человек

Ioann V
07.10.2018
21:15:31

Google

Rabu
07.10.2018
21:15:39
2^-1 ^2 = 2^-2

Крис
07.10.2018
21:17:17
чисто в этом примере да
Человек спрашивает, уместно ли сравнивать дробные числа таким образом для конкретных случаев когда согласно IEEE754 равенство гарантировано, или же стоит сравнивать с точностью до определенного епсилон как это делается в общем случае. Это если я правильно понял вопрос


Ioann V
07.10.2018
21:18:54
2^-1 ^2 = 2^-2
Так вот, мой вопрос предпосылка к тому, что.
Утверждение:
Если есть два числа полностью представимые в бинарном виде double(т. е имеют конечную запись в битах, без округлений) , то результат умножения этих чисел - число, которое бы мы получили если бы напрямую посчитали результат ручками и записали в бинарном виде.
Т.е bin(a) * bin(b) ==bin( a * b), где а и b полностью представимы double ом. Имеют конечную запись, в десятичной системе и при переводе в двоичную, имеют также конечную бинарную форму, которая полностью укладывается в битовую запись дабла.
Кто крякнет это утверждение? Пишите внимательно прочитав вопрос. Не пишите про случаи, когда число не представимо в двоичной записи. Типа 0.1 + 0.2 e. t. c
Например:
10. + 40. == 50. - true всегда, исходя из моего утверждения.
Исходники кодеров из гоогл - согласны со мной, как и комментарии в оных. Но может у них, какие то свои допущения.

Igor
07.10.2018
21:25:48

Igor
07.10.2018
21:25:52
Может потому что бинарный вариант не способен полностью представить именно десятичные числа?
Вот утверждение и верно
Просто попытка типа запутать, не более

Ioann V
07.10.2018
21:26:54

Igor
07.10.2018
21:31:27

Alex Фэils?︙
07.10.2018
21:31:46

Ioann V
07.10.2018
21:32:04

Alex Фэils?︙
07.10.2018
21:32:48
а я все равно перестрахуюсь!

Ioann V
07.10.2018
21:33:10
Если полной поддержки нету, то и бояться о погрешностях из за криворукости не нужно.

Igor
07.10.2018
21:33:45
в том примере можно точно на рвенство сравнивать
Еще раз повторю - есть разные режимы. Есть rounding mode (http://www.gnu.org/software/libc/manual/html_node/Rounding.html), есть разные режимы точности (например /fp:fast у MSVC, https://blogs.msdn.microsoft.com/vcblog/2015/10/19/do-you-prefer-fast-or-precise/).

Ioann V
07.10.2018
21:34:34
я знаю про это. Так а чем мешает это, если при округлении числа слева используется тот же мод, что и для справа?

Google

Ioann V
07.10.2018
21:36:11
т.е round(c) == round(a * b), где a * b == c, в условиях ручной записи.
а, б, ц полностью представимы в сетке дабла.
:?!

Igor
07.10.2018
21:38:38

Rabu
07.10.2018
21:39:18
мне кажеца шо гцц умеет оптимизировать

Igor
07.10.2018
21:40:32
А мне кажется, что будут проблемы

Ioann V
07.10.2018
21:41:14

Igor
07.10.2018
21:45:04

Ioann V
07.10.2018
21:45:48
123.23 точно там не представимо, поэтому беспокоит не наврал ли.

Igor
07.10.2018
21:46:05
Вообще это все слабо к C++ относится.

Ioann V
07.10.2018
21:46:48
так, давай без каких либо предвзятостей. Я тебя не пытался задеть, если что.
Вот сорцы гугла, читай комментарий.
Но именно так, они у себя в v8 переводят строки в числа. А по их спеке - это все, ieee754 true.

Igor
07.10.2018
21:59:19
#include <iostream>
#include <float.h>
int main()
{
unsigned int current;
_controlfp_s(¤t, _MCW_RC, _RC_DOWN);
double a = 12323.;
double b = 100;
if (a / b == 123.23)
std::cout << "Hello World!\n";
}
тут ничего не выведется

Ioann V
07.10.2018
22:06:39
А что значит контролировать режим fpu?

Igor
07.10.2018
22:08:45
А что значит контролировать режим fpu?
Выставлять флаги fpu при заходе в v8, у fpu несколько флагов и режим округления один из них - https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/controlfp-s?view=vs-2017.

Ioann V
07.10.2018
22:10:14
Окей, гляну, и попробую сопоставить полученную информацию. Но это точно лучше, чем просто нельзя, что звучало выше. И ведь таки можно.

Google

Ilia
07.10.2018
22:31:02

Matway
07.10.2018
22:42:23

Ilia
07.10.2018
22:43:43
Блин ну ты вытащил...

Matway
07.10.2018
22:45:13

Ilia
07.10.2018
22:46:09

Крис
07.10.2018
22:46:36

Ilia
07.10.2018
22:46:45


Matway
07.10.2018
22:49:37
Извините, а в чем выигрыш-то?
Вот у меня есть шейдер анимации. Ему на вход даются коэффициенты блендинга, от нуля до единицы. Флоаты, очевидно. Ну и по ним он сэмплит геометрию, очень хитрым образом. В процессе профайлинга выяснилось, что в 50% случаев один из коэффициентов строго равен единице. Достигается это тем, что blendFactor = std::min(blendFactor + frameIncrement, 1.0f). В шейдер добавили строгое сравнение с единицей, которое игнорирует ветку логики. Получили ускорение. По-другому не сделать - uniform bool передать дороже, переключить шейдер дороже и т.д.

Крис
07.10.2018
22:50:47

Matway
07.10.2018
22:50:59
Порядка 15%.

Крис
07.10.2018
22:51:28
Немало, хотел бы я понять почему же так :)

Ilia
07.10.2018
22:51:34
Вот у меня есть шейдер анимации. Ему на вход даются коэффициенты блендинга, от нуля до единицы. Флоаты, очевидно. Ну и по ним он сэмплит геометрию, очень хитрым образом. В процессе профайлинга выяснилось, что в 50% случаев один из коэффициентов строго равен единице. Достигается это тем, что blendFactor = std::min(blendFactor + frameIncrement, 1.0f). В шейдер добавили строгое сравнение с единицей, которое игнорирует ветку логики. Получили ускорение. По-другому не сделать - uniform bool передать дороже, переключить шейдер дороже и т.д.
Но тебе же и >= 1 подошло бы, разве нет,?


Matway
07.10.2018
22:54:38

Ilia
07.10.2018
22:56:38
Ну, странно...

Google

Matway
07.10.2018
22:57:06

Крис
07.10.2018
22:57:43

Matway
07.10.2018
22:59:25
А, нет. Илья правильно сказал, проверка типа abs(1.0 - x) < 0.001 дала бы такой же визуальный результат. Но зачем, если x == 1.0 и читабельнее, и точнее?

Крис
07.10.2018
23:00:19