?

Log in

No account? Create an account

Плавающе-точечное - Ваши рубидии уже у кобальта во ртути

Nov. 18th, 2013

12:51 am - Плавающе-точечное

Previous Entry Share Next Entry

[программистское]

В какой-то мере навеяно постом juan_gandhi

Что произойдет в вашей системе и что, по-вашему, должно произойти при попытке компиляции (и, если компиляция была/должна быть успешной, то запуска) следующей программы на Си:

#include <stdio.h>
main() {
printf("%d %d %d\n", (int)(-1.0/0.0), (int)(0.0/0.0), (int)(1.0/0.0));
}

Comments:

[User Picture]
From:lionet
Date:November 18th, 2013 09:11 am (UTC)
(Link)
INT_MIN, 0, INT_MAX

Потому что -inf, nan, inf.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:November 18th, 2013 04:22 pm (UTC)
(Link)
С виду логично, но сейчас мы всё бросим и пойдем существующие процессоры в кремнии хачить:


#include <stdio.h>
#include <stdlib.h>
int main(int c, char **v) {
printf("%d %d %d\n", (int)(-1.0/strtod(v[1], 0)), (int)(0.0/strtod(v[1], 0)), (int)(1.0/strtod(v[1], 0)));}


Что выходит с аргументом 0?
(Reply) (Parent) (Thread)
[User Picture]
From:lionet
Date:November 18th, 2013 06:20 pm (UTC)
(Link)
Бля.
(Reply) (Parent) (Thread)
[User Picture]
From:fregimus
Date:November 18th, 2013 09:18 am (UTC)
(Link)
При компиляции: error C2124: divide or mod by zero

Microsoft (R) C/C++ Optimizing Compiler Version 17.00.60610.1
(Reply) (Thread)
[User Picture]
From:spamsink
Date:November 18th, 2013 04:23 pm (UTC)
(Link)
На момент поста я его не пробовал, но так и думал.
(Reply) (Parent) (Thread)
[User Picture]
From:fregimus
Date:November 18th, 2013 04:28 pm (UTC)
(Link)
Измененная программа, ниже, чисто компилируется без оптимизации, а с включенной оптимизацией я получаю то же самое сообщение, только как warning. Соображает, что дурят его!
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:fregimus
Date:November 18th, 2013 09:21 am (UTC)
(Link)
void main() {
double z = 0.0;
printf("%d %d %d\n", (int)(-1.0/z), (int)(0.0/z), (int)(1.0/z));
}


-2147483648 -2147483648 -2147483648
(Reply) (Thread)
[User Picture]
From:archaicos
Date:November 18th, 2013 09:22 am (UTC)
(Link)
Если скомпилируется, то UB.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:November 18th, 2013 04:28 pm (UTC)
(Link)
Почему?
(Reply) (Parent) (Thread)
[User Picture]
From:archaicos
Date:November 19th, 2013 06:14 am (UTC)
(Link)
По определению?

C99:

The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined.

When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:b0p0h0k
Date:November 18th, 2013 09:31 am (UTC)
(Link)
-2147483648 -2147483648 -2147483648

Computer says −80000000.

Edited at 2013-11-18 09:33 am (UTC)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:November 18th, 2013 04:59 pm (UTC)
(Link)
Правильно.
(Reply) (Parent) (Thread)
From:t_mike
Date:November 18th, 2013 09:46 am (UTC)
(Link)
gcc (GCC) 4.8.2 20131017 (Red Hat 4.8.2-1)
-2147483648 -2147483648 -2147483648

clang version 3.3 (tags/RELEASE_33/rc3)
-2147483648 0 2147483647

gcc (Debian 4.6.3-14+rpi1) 4.6.3
-2147483648 0 2147483647

Edited at 2013-11-18 10:08 am (UTC)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:November 18th, 2013 04:29 pm (UTC)
(Link)
Вот именно. До GCC дошло, а до clang-а пока не дошло.
(Reply) (Parent) (Thread)
[User Picture]
From:sab123
Date:November 18th, 2013 06:04 pm (UTC)
(Link)
Чего дошло? До меня пока не доходит. В-общем случае оно небось все выходит за границы представления целых, поэтому результат неопределен. Но представлять плюс-бесконечность отрицательным числом, наверное, более неправильно, чем положительным.
(Reply) (Parent) (Thread) (Expand)