Size: a a a

Compiler Development

2020 March 11

MM

Mikhail Maltsev in Compiler Development
2**31 = 2147483648
источник

MK

Matwey Kornilov in Compiler Development
2**31 + 2**8 ?
источник

MM

Mikhail Maltsev in Compiler Development
Я к тому что
res = (int)-2147483904.0f;
это UB
источник

KR

K R in Compiler Development
Mikhail Maltsev
Я к тому что
res = (int)-2147483904.0f;
это UB
Непонятно, почему шланговцы не вставляют return 0 в начало main, как только находят ub.
источник

M

MaxGraey in Compiler Development
Mikhail Maltsev
А что за константа 2147483904?
Из спеки:
https://github.com/microsoft/ChakraCore/blob/3daa56768f45594ec3461731e68865323900acf1/test/WasmSpec/features/nontrapping/nontrapping_conversions.wast#L29

Так же это реализовано и в других движках. Например:
https://github.com/bytecodealliance/wasm-micro-runtime/blob/da04f89f9d0c525d724076684ee1c0c8c614aebd/core/iwasm/compilation/aot_emit_conversion.c#L120

Связано это с hidden bit:

0 < exb =< 2^n-1  S * 2^(exb-2^(n-1)) * (0.1_visman) [with hidden bit]
источник

KR

K R in Compiler Development
А почему вы не можете тупо вставить INT_MAX?
источник

AZ

Alexander Zaitsev in Compiler Development
K R
Непонятно, почему шланговцы не вставляют return 0 в начало main, как только находят ub.
Действительно, почему же
источник

M

MaxGraey in Compiler Development
K R
А почему вы не можете тупо вставить INT_MAX?
DВообще похоже придется
источник

KR

K R in Compiler Development
MaxGraey
DВообще похоже придется
В гугле пишут, что вы и вставили, но числом. А в исходниках gcc что-то другое.
источник

M

MaxGraey in Compiler Development
но проблема в том, что тогда бы только одна ветка должна была исчезнуть, но исчезает почему то и вторая
источник

M

MaxGraey in Compiler Development
Я про

else if (x >= 2147483648.0f) {
       res = (int)2147483648.0f;
}
источник

MM

Mikhail Maltsev in Compiler Development
Лол, тут тоже UB:
res = (int)2147483648.0f;
Должно быть 2147483647 иначе будет overflow
источник

M

MaxGraey in Compiler Development
Mikhail Maltsev
Лол, тут тоже UB:
res = (int)2147483648.0f;
Должно быть 2147483647 иначе будет overflow
Кстати да, не заметил.
источник

KR

K R in Compiler Development
Ну я заменил эти страшные числа на 8 и 99 - поменялось!
источник

KR

K R in Compiler Development
Появляются белые строки.
источник

KR

K R in Compiler Development
Если вы сделаете двойное преобразование INT_MAX в float и обратно, вы получите переполнение...
источник

KR

K R in Compiler Development
И вообще, в ieee 754 у float 24 байта => реобразование целых > 2^24 будет с потерей точности.

Соответственно, нужно как-то аккуратно считать макс целое, представимое floatом

Это INT_MAX -2^8 (один ulp). И, соответственно, минимальное -INT_MIN + ulp
источник

AP

Antony Polukhin in Compiler Development
А на каких значениях будет различаться результат?

Кажется что в стандарте C был отдельный ад о преобразованиях float к int и возможно что оптимизация позволительна
источник

AP

Antony Polukhin in Compiler Development
Mikhail Maltsev
Лол, тут тоже UB:
res = (int)2147483648.0f;
Должно быть 2147483647 иначе будет overflow
да, типа такого ^
источник

MM

Mikhail Maltsev in Compiler Development
K R
И вообще, в ieee 754 у float 24 байта => реобразование целых > 2^24 будет с потерей точности.

Соответственно, нужно как-то аккуратно считать макс целое, представимое floatом

Это INT_MAX -2^8 (один ulp). И, соответственно, минимальное -INT_MIN + ulp
Да, по поводу intmax правда.
источник