Сап двач, объясните сука кто разбирается простыми словами следующие вещи:
1) Почему 0.1 + 0.2 === 0.30000000000000004? Почему так происходит? Нигде в русском инете не нашел детального объяснения кроме "ну там процессор, хуе мое, бесконечная дробь, там". Не кидайте эти долбаебские статьи с хабра где снобы-авторы все усложняют какими-то математическими хуйнями, и даже сами не понимают что несут. Если ты тот самый дохуя умный пидор который лайкает и распространяет эти статьи, пишет комментарии словно понимает эти блядские иероглифы можешь идти нахуй.
2) Почему 9999999999999999 === 10000000000000000?
3) Почему если число увеличивается, то он приобретает вид экспоненциальной записи, например: "1e+25"? Сомневаюсь что просто для удобства чтения, потому что 9999999999999999999999999 + 1 === 9999999999999999999999999 === true.
>>251078239 (OP) > Почему 0.1 + 0.2 === 0.30000000000000004? Почему так происходит? Нигде в русском инете не нашел детального объяснения кроме Тупой чтоль? Есть там объяснения. Потому что числа конвертятся в двочные, складываются, потом обратно в десятичные. Из-за этого ошибки, как при если в гуг-переводчик перевести текст на монгольский, потом обратно на русский. > 2) Почему 9999999999999999 === 10000000000000000? Это где так, в JS Я хз
это равенство корректно, именно если дробь 0,9999... бесконечна. Только в этом случае она обладает всеми свойствами что и 1. С точки зрения анализа м оперций в анализе 0.(9) удовлетворяет всем свойствам что и 1. А самая главная аксиома наименьшей верхней границы.
К примеру любое не пустое множество ограниченное 1, как самой нименьшей верхней границей, так же ограничена 0.(9) как наименьшей верхней границей. Сам проверь: дай мне любое число которое якобы стоит между 0.(9) и 1 и я докажу тебе что это не так. Это одно и тоже вещественное число и между ними нету числа.
>>251078239 (OP) Потому что в JS используются числа с плавающей запятой, а целых чисел нет. А у чисел с плавающей запятой своя арифметика, похожая на школьную арифметику только издалека. Чем ближе смотришь, тем больше оно различается.
Почему так? Потому что числа с плавающей запятой придумывали для учёных, чтобы удобно пикофарады на теравольты умножать и сохранять значение в рамках погрешности.
Вот какой долбоёб их в JS как обычные числа взял - это вопрос открытый.
>>251078239 (OP) >1 Блять ну как ты в двоичном виде десятичное число сохранишь? то что конечно в десятичной степени бесконечно в двоичной и наоборот (ну иногда нет если кратно). ...04 это просто погрешность
>>251078908 Нахуй ты на этот тролинг ведешься? Ща эта ебенашка скинет как в его любимом хуйтоне или си шарпе о котормо ему на гикбрейнс рассказали, отображается как 0.3, и ему похуй что оно просто округляется визуально
>>251078239 (OP) 1) Дело такое: в памяти компика все данные представлены в двоичном виде, а дробное десятичное число при переводе из 10 в 2 форму будет почти всегда бесконечной дробью, которую в память компа не записать, поэтому и происходят ошибки, а компьютер пытается компенсировать эту проблему увеличение числа с 0.3 до 0.30000004. Для примера попробуй на листочке перевести 0.3 из десятичной формы в двоичную и обратно по формуле. Вот 2 скрина что вышла на онлайн калькуляторе.
>>251082085 sql. php. с1. Сами языки проще, не считая пхп с его ооп, вкат быстрее, пориджи не рвутся один за другим пытаясь выучить язык по сложности схожий с джавой.
>>251082212 Если он не смог это осилить и понять, хотя ему в треде уже разжевали и он писал, что не понял, сможет ли он в самую простую архитектуру, сможет ли добавть функционал не сломал приложение? Я думаю нет.
>>251078239 (OP) Вот JS-пидоры, ещё гонят на пхп господ, идите просто нахуй с таким говном. Пыха особенно после 7.2, это сам язык боженьки, именно для этого его и создали, что бы бог общался с нами. А вы говноеды сидите со своим забагованым говном в котором сами не могут разобраться уже столько лет.
>>251082332 >Если он не смог это осилить и понять, хотя ему в треде уже разжевали и он писал, что не понял, сможет ли он в самую простую архитектуру, сможет ли добавть функционал не сломал приложение? Я думаю нет. Хуйлуша тупая, я не говорю что не понял, мне просто нужно детальное объяснение, а не высер уровня "дроби бесконечные в двоичном формате" Я давно пишу на JS и поддерживаю код, это вообще не связано с низкоуровневым дрочевом с плавающими числами >>251082476 Я уже разобрался, максимальное безопасное число
>>251080296 то есть пошагово минус i-ю степень двойки прибавляешь на i-ом шаге итерации, так и не приблизившись в итоге к значению если оно не кратно бля у меня не очень с математикой >>251082926 кун
>>251081538 Да это какой-то особенно тупой, привыкли к тому, что жс позиционируют как язык для тупых и обсираются на областях замыкания и разницы между декларированием и выражением функции
>>251078239 (OP) Объясняю на пальцах. Арифметика js не выебывается и использует дробную арифметику процессора. Он двоичный, а еще в нем место для хранения чисел не резиновое. Вспомнишь об этом когда дочитаешь следующее.
Допустим ты решаешь на листочке и место у тебя только на 4 знака после запятой. Сколько будет 1/3 х 3? Один, так? А теперь запишем на листочке: 1/3 = 0.3333 (наш десятичный цпу не умеет в дроби, только в 0.1234e+N) 0.3333 х 3 = 0.9999 0.9999 не равно 1 Это пример обсера с ограниченной точностью.
Теперь вернись выше и осознай, что 1/10 в двоичном виде это такая же бесконечная дробь, как 1/3 или 1/7 в десятичном. Самые последние биты иногда округлены, поэтому в конце копится ошибка +-1.
Для вывода пользователю числа часто округляют до 14 десятичных цифр, чтобы скрыть ошибку (цпу может хранить до 16 цифр точно, до 18 неточно). Но конкретно консоль браузера и ноды не делают таких округлений при выводе, поэтому ошибка вылазит. Не делают потому что программисту лучше видеть ее, чем не видеть, ведь 0.1+0.2 != 0.3. Если обезьяна обосрется и будет использовать === или !== для дробных чисел в коде (есть способы неточного сравнения, они разные в зависимости от нужд и в язык не встроены).
>инб: почему в цпу не делают нормальные десятичные числа Потому что они все равно будут ограничены в колве цифр и 1/3 х 3 обосрется как в примере выше. Какая разница где обсираться? >инб: почему в js не сделают нормальные дроби или высоченную точность Потому что (1) дроби это все еще не все числа, например результат sin(x) не является дробью для большинства иксов и будет копить ошибку. (2) это очень медленно и бессмысленно на практике. Проще манькам объяснить дабл пресижен фп, чем страдать всем миром из-за этого.
>>251078239 (OP) >2) Теперь прикинь, что у тебя в нашем цпу, который умеет только 0.1234е+N лежит число 12340. Как оно лежит там? Вот так: 0.1234е+5 Ты хочешь прибавить 1, но 1 ложится в пятый несуществующий разряд и округляется. Получается снова 0.1234е+5, т.е. 12340. К этому числу можно прибавить только минимум 5, чтобы его изменить.
а почему это вообще важно? жс он же для свистелок и перделок на веб страничках, а не научных вычислений скорости уранового лома, брошенного в известное место.
>>251078239 (OP) >3) Почему если число увеличивается, то он приобретает вид экспоненциальной записи, например: "1e+25"? короче запись, меньше памяти занимает /thread
>>251078239 (OP) >3) Почему если число увеличивается, то он приобретает вид экспоненциальной записи, например: "1e+25"? короче запись, меньше памяти занимает /thread
>>251078908 Поздно увидел ответ, но твой комментарий меня заинтересовал, я сам увлекаюсь математикой, но каким образом 0.(9) имеет те же свойства, что и 1? Давай предположим, что у нас есть множество от 0 до 0.(9), и оно ограниченно сверху, у нас в данном случае 1 будет супремумом нашего множества, то есть наименьшем элементом ограничивающего множества, откуда получается что у них разные свойства, и конечно же не равны.
>>251078239 (OP) > 1 Какие же вы программисты тупые, лол блять. 0.1+0.2 у них не 0.3 получается. Блять лоол я хуею, и они это еще оправдывают и защищают, и объясняют, почему так. Понятно теперь, почему все говно, написанное на javs, js такое медленное, глючное и багованное.
>>251078239 (OP) > Нигде в русском инете не нашел детального объяснения кроме "ну там процессор, хуе мое, бесконечная дробь, там". Не кидайте эти долбаебские статьи с хабра где снобы-авторы все усложняют какими-то математическими хуйнями А потом такие лендингошлёпы приходят на собесы и говорят, что они йоба-синьоры с желаемыми 300кк/нс
>>251085895 По определению. По памяти, объяснение примерно такое, посколько всегда можно дописать девятку, то между 0.(9) и 1 невозможно всунуть ни одно число.
>>251086347 Ебанашка, так работает любой процессор с фп на ieee754. И кресты, и сишка, и ява, и любая хуява так работает, потому что это нативные числа цпу. Это двоичная арифметика с ограниченной точностью. Ты просто манька, которая впервые увидела что-то кроме десятичного счета на палочках и подорвалась по левой причине, не поняв сути. Эти числа не предназначены для точных вычислений, точность это очень дорого, просто не все макаки это понимают и думают, что у них там числа как в школе. Если тебе нужны точные вычисления в каком-то домене, ты берешь либу для этого домена и вычисляешь на ней. Целые числа до 2 в степени 64 есть в цпу бесплатно, выше пакет bigint. Числа с плавающей точкой с ограниченной точностью тоже бесплатно, выше пакет bignum. Если для задачи хватит рациональных, берешь пакет rational. Если нужны иррациональные (а это вся геометрия), то ты в жопе, и ты берешь пакет символьной алгебры, который оперирует не дробями, а формулами (типа маткада) и за пиздец дорого ебически слодными алгоритмами может считать любую хуйню до любой нужной точности. Но уже не за наносекунды, а за миллисекунды. Программирование и железо это постоянные торги с реальностью, если бы их не совершали, а делали «как у людей», то у тебя бы не было ни жта, ни доты, в которых ты так силен раковать.
>>251082312 Есть BigDecimal (в жабе, хз что у вас там в JS), там всё просто и понятно, да и без потери точности, только сука медленно. Поэтому используется только для денежных сумм.
>>251082291 Идиот ебаный, это даже не программирование, это буквально школьный курс информатики. Кто виноват, что ты на уроках играл в телефон или ваш даун-препод вместо учебника полякова проходил с вами пеинт.
>>251089902 >Кто виноват, что <..> ваш даун-препод <..> проходил с вами пеинт Ну уж всяко не анон, лол. Я, например, в своём скверном школьном образовании (или, скорее даже, в его полном отсутствии: доставшаяся мне в конце девяностых преподня и с имитацией-то образования толком не справлялась) безо всякой иронии виню ЦРУ и план Даллеса.
>1) Почему 0.1 + 0.2 === 0.30000000000000004 Потому что дроби в двоичной системе представляют сумму из дробей с единицей в числителе и степенью двойки в знаменателе. Например, 0.1 = 1/16+1/32+1/256+1/512+1/4096+1/8192+1/65536 + ... и там ещё дохуя разрядов, долго считать. Аналогично, 0.2 = 1/8+1/16+1/128+1/256+1/2048+1/4096+1/32768+1/65536 + ... Если ты сложишь эти дроби, то круглого числа ты уже не получишь.