Our Blog

Прикол с арифметикой на C++

Друг показал мне один прикол с переменными, когда выполняются одни и те же арифметические операции, а выдаются разные результаты.

Код «Прикол с арифметикой на C++»:

#include <stdio.h>
int main(void) {
  float a = 0.123456, b = 0.13;
  printf("%.30f\n",(float)((a*b)/b));
  printf("%.30f\n",(float)(a*(b/b)));
  return 0;
}

Сами подумайте, по законам алгебры переменная b в обоих случаях должна сократиться и остаться только переменная a, значение которой и должно выводиться пользователю. Теперь скомпильте исходник и посмотрите на вывод:
0.123455993831157684326171875000
0.123456001281738281250000000000
Совсем разные числа

У одного из наших пользователей с ником Volk данный код вызвал недовольство, которое он выразил следующим комментарием:
Школота такая школота… А если раз в жизни книжку открыть, и почитать как происходят вычисления с плавающей запятой? Ты не знал что в операциях с плавающей запятой происходит потеря точности?
>по законам алгебры…
С чего это вдруг твой компьютер знает законы алгебры? Ты его научил? Установи MathCAD или Maxima, пиши скрипты в них, и будет тебе алгебра.
Если прекратить страдать хернёй, освоить наконец стандартную Сишную библиотеку вместо ежедневной дрочки на порнуху, подключить limits.h и посматреть пременную FLT_DIG… СЮРПРИЗ! Он посчитал настолько точно, насколько гарантированно операциями с использованием типа float! Хочешь считать точнее — юзай double, блджад!
Программа это всегда однозначная последовательность действий, если ты идиот — не вини компьютер или разработчиков компиляторов. Они не виноваты, что разворачивать выражения тебя научили, а на сворачивание мозгов у тебя нехватает. А компилятор перевёл твою программу именно в те инструкции, которые написаны в исходнике.
Язык Си вообще всегда отличался тем что они никогда за программиста ничего не делает. Всё что ты пишешь на Си воспринимается компилятором буквально и компьютер именно так как написано будет выполнять. Именно поэтому программы на Си так быстры и отличаются небольшим размером. Конечно если у программиста руки прямые. И именно поэтому криворукие мудаки на нём ничего серьёзного не пишут, потому что немогут. Им Python подавай, там и алгебра есть, и garbage collector для мудаков, которые сами за памятью следить не могут. И операцию xor там тоже знать ненадо для быстрого и каноничного обмена местами переменных (где-то тут рядом есть новость с говнокодом недо-Паскалистов по обмену переменных местами…) ненужен, потому что с длинной математикой вообще не нужно помнить о переполнении, а действия и так со скоростью черепахи производятся. И имено поэтому умение писать хорошие программы на Си есть один из самых показательных критериев профессионализма программиста. И именно поэтому программисты на Паскале и Делфи самые низкооплачиваемые.
P.S. Если бы ты поставил Linux не для фаллометрии, а чтобы использовать его хоть и как менее дружественную к пользователю, но потенциально более совершенную OC. И если бы ты учился не по нигам типа «Как выучить С++ за неделю, каждые сутки занимаясь по 16 часов сном и дрочкой», а нормальным серьёзным учбникам, то ты бы хоть раз открыл ман по GCC. Я всю жизнь в виндах просидел, и то знаю, что у GCC очень неплохой оптимизатор и если ты добавишь в командной строке к вызову GCC что-нить типа -o3, то возможно таки он заметит тавтологию в твоём говнокоде и исправит его.
Спасибо за внимание.
С уважением, и ненавистью за распиздяйство и лень…

Comments ( 0 )
    -->