Бред

Ответить в тред Ответить в тред
Check this out!
Аноним 20/09/21 Пнд 18:52:32 2547257921
image.png 58Кб, 1251x705
1251x705
Двач, объясни пожалуйста дауну, как перевести float (4 байта) в double (8 байт)?
Я раньше думал, что можно просто 4 нулевых байта добавить и будет норм, а оказалось нихуя. Единственное, что я понял, что первый бит в записи означает знак (0=+, 1=-), остальное какая-то ебаная магия, какие-то непонятные цифры, хз че происходит помогите
Аноним 20/09/21 Пнд 18:53:48 2547258732
Похромисты, выручайте. Бамп
Аноним 20/09/21 Пнд 18:55:06 2547259733
Бамп
Аноним 20/09/21 Пнд 18:56:10 2547260394
Бамп
Аноним 20/09/21 Пнд 18:57:29 2547261285
Бамп
Аноним 20/09/21 Пнд 18:58:09 2547261666
Аноним 20/09/21 Пнд 18:59:28 2547262467
Аноним 20/09/21 Пнд 19:01:25 2547263458
Бамп
Аноним 20/09/21 Пнд 19:02:14 2547263839
>>254726166
Мне нужно не для конкретного языка, а в общем алгоритм, что как делать, какие математические операции делать.
Аноним 20/09/21 Пнд 19:05:59 25472660810
бамп
Аноним 20/09/21 Пнд 19:13:03 25472703011
бамп
Аноним 20/09/21 Пнд 19:14:15 25472711312
Бамп
Аноним 20/09/21 Пнд 19:16:13 25472723013
Аноним 20/09/21 Пнд 19:17:44 25472732114
>>254725792 (OP)
Ну, к экспоненте нули вперёд, к мантиссе - нули назад. Вроде так. А нахуя, если компьютер это делает аппаратно?
Аноним 20/09/21 Пнд 19:18:27 25472736315
image.png 388Кб, 604x543
604x543
Аноним 20/09/21 Пнд 19:21:02 25472751416
>>254727321
>А нахуя, если компьютер это делает аппаратно?
У меня он делает какую-то хуйню.
Например есть float 1.73
Я перевожу в double и получаю 1.7299999935683924 вроде такой хуйни.
Аноним 20/09/21 Пнд 19:21:39 25472755417
>>254727363
float x = 1;
double y = (double)x;

Скомпилируй на разных архитектурах и посмотри дизассемблером как компилятор это делает.
Аноним 20/09/21 Пнд 19:23:37 25472766318
>>254727514
>Например есть float 1.73
Не бывает такого float. Разберись, что это за тип данных сначала.
Аноним 20/09/21 Пнд 19:24:14 25472769019
Аноним 20/09/21 Пнд 19:24:31 25472771320
>>254727514
Так и должно быть. В рамках погрешности флоата. Там вообще на разных архитектурах может немного по разному давать результат.
Аноним 20/09/21 Пнд 19:25:55 25472780921
>>254727690
> В отличие от чисел с фиксированной запятой, сетка чисел, которые способна отобразить арифметика с плавающей запятой, неравномерна: она более густая для чисел с малыми порядками и более редкая — для чисел с большими порядками.
Аноним 20/09/21 Пнд 19:26:44 25472785522
Нихера себе вы долбоебы какой херней маетесь. Надо тупа объявить дабл тогда, и никакого флоата!
Аноним 20/09/21 Пнд 19:27:01 25472787323
Нихера себе вы долбоебы какой херней маетесь. Надо тупа объявить дабл тогда, и никакого флоата!
Аноним 20/09/21 Пнд 19:27:05 25472787524
>>254727713
ДА ЧТ ЗА НАРКОМАНИЯ БЛЯДЬ?
Как одно число превращается в другое? Вот было у меня 2 яблока, я перекинул его в другую корзину и стало 1 яблоко. Куда еще одно делось?
Аноним 20/09/21 Пнд 19:28:36 25472798325
>>254727855
А если тебе изначально приходит флоат извне программы?
Аноним 20/09/21 Пнд 19:29:11 25472802326
Аноним 20/09/21 Пнд 19:31:33 25472815727
Бамп
Аноним 20/09/21 Пнд 19:31:36 25472815828
>>254725792 (OP)
float это же не целые числа с запятой.
или я чего то не понимаю? что тебе мешает блять взять табоицу байтов(или как ткм она называется), и перевести блять это в байты?
Аноним 20/09/21 Пнд 19:31:42 25472816129
Untitled.png 16Кб, 1230x182
1230x182
Аноним 20/09/21 Пнд 19:31:55 25472817130
>>254727875
Ещё одно обозначает знак, представь запись числа один: 01, +1, -1. Аж целых три варианта для двух символов, неизвестно какой реализовали у тебя.
Аноним 20/09/21 Пнд 19:32:09 25472819331
>>254727983
Конвертируй в строку, а потом парси ее в дабл, делов то.
мимо-веб-программист
Аноним 20/09/21 Пнд 19:33:08 25472826232
>>254728193
пиздец рыгнул с тебя
мимо-эмбеддед-программист
Аноним 20/09/21 Пнд 19:35:37 25472840233
>Я раньше думал, что можно просто 4 нулевых байта добавить и будет норм, а оказалось нихуя.
Это сработало бы для целочисленных типов, но для чисел с плавающей точкой дополнительные биты не только расширяют диапазон, но и увеличивают "точность" (т.е. кол-во знаков после запятой)
Аноним 20/09/21 Пнд 19:36:22 25472845834
>>254728262
что за примитивизм, округляешь до целой и профит

мимо индус 300к/наносек
Аноним 20/09/21 Пнд 19:36:41 25472847335
>>254728402
Так че сделать то надо, чтобы перевести из одного в другое? И чтобы ничего никуда не проебывалось.
Аноним 20/09/21 Пнд 19:38:54 25472858636
>>254728473
округлять до запятой и копировать пару чисел после
Аноним 20/09/21 Пнд 19:39:25 25472861837
>>254728262
> эмбеддед
Нахуя твоим мк вообще обрабатывать шо-то больше инта?
Аноним 20/09/21 Пнд 19:40:06 25472866138
>>254725792 (OP)
Кому вообще эти плавающие точки нужны кроме учёных и астрономов? Игры/видео/аудио/нейросети прекрасно работают на целочисленной арифметике.
Аноним 20/09/21 Пнд 19:40:32 25472868539
>>254728618
дохуя чего, показания датчиков и тд.
Аноним 20/09/21 Пнд 19:40:48 25472870540
>>254728661
>Игры/видео/аудио/нейросети прекрасно работают на целочисленной арифметике.
Ок, зумер.
Аноним 20/09/21 Пнд 19:41:40 25472875341
>>254728586
А более цивилизованного способа нет? хоть и выглядит работоспособным
Аноним 20/09/21 Пнд 19:42:00 25472877642
>>254728705
Что не так? Банки исключительно на целых производят вычисления. НИкаких плавающих и подобных. Не?
Аноним 20/09/21 Пнд 19:42:13 25472879043
>>254728685
>>254728705

Домножить единицу на 1000 чтоб без запятыхоаботать не судьба?

мимо индус 300к/наносек
Аноним 20/09/21 Пнд 19:43:39 25472888244
>>254728753
Есть наверняка, но зачем если мощность позволяет.
Аноним 20/09/21 Пнд 19:43:45 25472888945
>>254728790
я смотрю у тебя дохуя лишних процессорных тактов, пидор
Аноним 20/09/21 Пнд 19:47:50 25472914546
>>254728889
Главное чтоб работало, а на выходе нарисуешь запятые и будет даже быстрее чем если бы считал как обычно.
Аноним 20/09/21 Пнд 19:51:08 25472937247
>>254729145
>Главное чтоб работало
Когда нужно несколько лямов операций в секунду, работать перестанет.
Аноним 20/09/21 Пнд 19:51:11 25472937648
>>254728753
Блядь, в чем сложность-то, выше уже есть ссылки на википедию, где половина кода написана:
Рабираешь побитовыми операциями свой 32-битный флоат на знак/порядок/мантиссу, собираешь из них 64-битный double.
Аноним 20/09/21 Пнд 19:53:49 25472954849
>>254729372
С чего бы, не целочисленные расчёты менее естественны, так что зависнет от запятых, а не от больших положительных.
Аноним 20/09/21 Пнд 19:53:54 25472955350
>>254729376
>собираешь из них 64-битный double.
Как, блядь? Я понимаю, где знак-порядок-мантисса, но как их превратить в 64-битный формат непонятно нихуя.
Аноним 20/09/21 Пнд 19:57:42 25472978051
>>254729553
Там в википедии есть "Общий шаблон для побитового доступа" (для флоата), тебе нужно понять, как это работает и написать такой же для дабла.
Аноним 20/09/21 Пнд 20:02:42 25473005352
image.png 63Кб, 1249x680
1249x680
>>254729780
>"Общий шаблон для побитового доступа" (для флоата), тебе нужно понять, как это работает
Ебаный рот, я в курсе, что такое побитовый доступ.
Вот тебе на пикрелейтеде, одно и то же число.
1) показатель для Float 10000111;
2) показатель для Double 10000000111;
Каким ебаным хуем первое превращается во второе?
Аноним 20/09/21 Пнд 20:04:01 25473013653
Бгг, пользуйся встроенными средствами языка. Ты всё равно просчёт экспоненты не осилишь.
Аноним 20/09/21 Пнд 20:05:34 25473024254
Аноним 20/09/21 Пнд 20:07:31 25473035455
>>254730242
А этого можно "избежать", если сначала кастить в строку. Знаешь почему так происходит? Потому что изначально флоат хранит больше данных, чем отображает. То есть потери информации не происходит.
Аноним 20/09/21 Пнд 20:07:38 25473036256
>>254730053
Перебираешь справа налево, если нулики до конца -- тыришь циферку и пишешь её в строку, затем достаёшь свой дабл и тыкаешь её туда, не забывая нарисовать запятую.
Аноним 20/09/21 Пнд 20:09:06 25473046257
>>254730354
>А этого можно "избежать", если сначала кастить в строку.
И че мне потом строку ковырять? Это же максимум уебанство.
Аноним 20/09/21 Пнд 20:11:49 25473061658
>>254730053
>Каким ебаным хуем первое превращается во второе?
Ну все же на твоей картинке расписано:
135-127 == 1031-1023
Хорошь тупить.
Аноним 20/09/21 Пнд 20:11:49 25473061759
>>254730362
>Перебираешь справа налево, если нулики до конца
Чего? Если нулики до конца, то число = 0, до какого конца то?
> тыришь циферку и пишешь её в строку
Какую циферку? Куда её писать, о чем ты вообще.
Аноним 20/09/21 Пнд 20:12:42 25473065760
>>254730462
Касти встроенными средствами языка, ещё раз говорю. Если отображаешь в гуй, то используй округление, чтоб красивее было.
Аноним 20/09/21 Пнд 20:12:42 25473065861
>>254730616
Что это за цифры? Откуда они берутся? Блять проще никак что ли?
Аноним 20/09/21 Пнд 20:13:50 25473073162
>>254730657
>то используй округление
Не работает округление, я хз почему. Пишет всё это говно после запятой, сколько бы я не округлял.
Аноним 20/09/21 Пнд 20:16:50 25473091263
>>254730731
Берёшь вбиваешь в гугл свой язык программирования и гуглишь округление. Не может такого быть, чтобы округление не работало.
Аноним 20/09/21 Пнд 20:18:18 25473100964
>>254730617
Проверку сделать не судьба? Куда хочешь туда и пишешь, твоя задача превратить входные данные в удобные для дабла символы.
Аноним 20/09/21 Пнд 20:18:26 25473102065
image-7.jpg 41Кб, 720x540
720x540
Аноним 20/09/21 Пнд 20:19:32 25473108566
>>254730731
Умножаешь на 100 и переписываешь число без запятой, потом две цифры отделяешь на выводе. Что как маленький.
Аноним 20/09/21 Пнд 20:19:48 25473110567
>>254730912
Округление работает только если я представляю число в десятичной записи типа 0.0033. А если в экспоненциальной, то пишет хуету вроде 3.299993584383573e-3. Мне надо именно экспоненциальная форма.
Аноним 20/09/21 Пнд 20:21:31 25473121868
>>254730658
135 = 10000111 экспонета флоата, меряется от 127 (0x7F), т.е. +8
1031 = 10000000111 экспонета дабла, меряется от 1023 (0x3FF), т.е., ВНЕЗАПНО, снова +8
Аноним 20/09/21 Пнд 20:21:45 25473123269
>>254731105
Это крайне долбоёбская задача. В таком случае советую округлять через форматирование строк. Но для вычислений округление уже не использовать, потому что ну ёбаны в рот, какого хуя-то блядь.
Аноним 20/09/21 Пнд 20:21:50 25473123870
>>254731105
>хочу в виде чуши
>вижу чушь
>удивляюсь
Аноним 20/09/21 Пнд 20:23:47 25473136871
>>254731232
Так ему сразу сказали делать через строки, а он хочет не решение получить, а перед кем-то отчитаться видимо. В реальности этим не занимаются, главное чтоб работало, а как - не твоя проблема.
Аноним 20/09/21 Пнд 20:26:54 25473157372
>>254731238
Это не я хочу, а так надо по условию задачи.
>>254731232
Как это округлять через форматирование строк? Ты имеешь в виду просто отбрасывать лишнее или что? В любом случае мне надо производить расчеты с числом, значит придется обратно переводить, это уже потеря точности.
Аноним 20/09/21 Пнд 20:30:52 25473184673
>>254731573
Нет, это ты хочешь и всё. Была бы задача - ты бы решил просто представив всё как целое число, в меру требуемой точности, а на выходе дорисовал бы что надо. Заказчик всё равно не увидит, а результат будет. А вот если это понты всякие, вроде задачи для учебника, то тут надо смотреть мануалы и отгадывать что именно от тебя хотят увидеть.
Аноним 20/09/21 Пнд 20:32:41 25473197774
>>254731368
Иногда важно знать, как работает, но выводить в гуй значения в не человекочитаемых форматах - чистый долбоебизм.

>>254731573
>Ты имеешь в виду просто отбрасывать лишнее или что?
Примерно так округление и работает.
>В любом случае мне надо производить расчеты с числом
Ты тупой? Ты тупой. Зачем тебе проводить расчёты с округлённым числом, где информация в любом случае будет теряться, когда у тебя есть оригинальное число. Не округлённое. В гуй выводи хоть залупу конскую, хоть строки. Для вычислений это не важно. А вычисления производи над наиболее полными данными.
Аноним 20/09/21 Пнд 20:35:08 25473213875
>>254731977
Читаемый формат делается подстановкой нужных символов в нужном месте, я это говорю как чел который сделал эмулятор машины тьюринга и тайно пользовался ею вместо готовых процедур, ибо весело.
Аноним 20/09/21 Пнд 20:37:36 25473228776
>>254731846
>Нет, это ты хочешь и всё. Была бы задача - ты бы решил просто представив всё как целое число, в меру требуемой точности, а на выходе дорисовал бы что надо. Заказчик всё равно не увидит, а результат будет.
Заказчик хочет увидеть число в экспоненциальной форме, т.е. N x 10^M.
>>254731977
>Примерно так округление и работает.
Че ты несешь? Так работает округление только в меньшую сторону.
>Зачем тебе проводить расчёты с округлённым числом, где информация в любом случае будет теряться, когда у тебя есть оригинальное число.
Оригинальное число хуевое.
Вот например есть число 1e-3, которое поступает в виде флоат 4 байта. Если я перевожу его в дабл, оно превращается в 9.999999353812e-4. Превращение в строку превратит это в явное говно. Мне нужно именно 1e-3, а не 9.9e-4.
Аноним 20/09/21 Пнд 20:39:06 25473237777
>>254732287
Берёшь десятичное написание, тыришь циферки и записываешь так как просят. Если точность не проверяют - можешь ходь рандомный диапазон после запятой задавать.
Аноним 20/09/21 Пнд 20:40:40 25473248578
>>254732377
Почему нет способа цивилизованно сделать без наебалова?
Аноним 20/09/21 Пнд 20:41:24 25473252179
Аноним 20/09/21 Пнд 20:45:07 25473277780
>>254732485
Он есть, тебе выше объяснили, через юнионы, арифметику и битовые операции, но тебе сложна.
Аноним 20/09/21 Пнд 20:45:27 25473280281
>>254732485
Это и есть цивилизованный способ, может и есть супер-пупер функция чтоб делать так как ты сказал, но внутри может быть та же самая история. Более того скажу - комп именно так и работает, он не воспринимает нашу чушь и считает всё целочисленным, а уже потом расценивает некоторые числа не так как другие. Познай природу компьютера, будь естественным, кодь как индус.
Аноним 20/09/21 Пнд 20:49:15 25473302682
>>254732802
Нихуя он не считает всё целочисленным.
Аноним 20/09/21 Пнд 20:51:09 25473313783
>>254733026
Всё считает, физически у него есть только ничего и единички, а чтоб ты смог увидеть что-то после запятой или с минусом - приходится часть чисел расценивать не как часть числа, а как знаковую и дополнительную области.
Аноним 20/09/21 Пнд 20:54:24 25473334084
>>254733137
Нет, для компьютера есть массивы битов. Это не то же самое, что единички и нолики, нолики и единички - это отображение для людей. Так вот если массив битов, который воспринимается компьютером, как число с плавающей запятой. И расчёты над этими числами выполняются на соответствующих аппаратных блоках, например FP32.
Аноним 20/09/21 Пнд 20:55:28 25473339685
>>254732777
Блять ладно, попробуем еще раз. Вот например число 1e-3:

sign exponent mantissa
+1 1013 1.0000011000100100110111010010111100011010100111111100 (binary)
+1 2^(1013 - 1023) 1.024
+1 0.00097656250000000000 1.024
0.001

+1 степень, это ясно.
степень 1013 - это что? Это в десятичном выражении или как? Откуда это число взялось? Почему основание степени - двойка? Что такое 1.024? Я так понимаю это нужно разложить снизу вверх? Как они 0.001 разложили на это: +1 0.00097656250000000000 1.024?
Аноним 20/09/21 Пнд 20:57:50 25473353486
>>254733340
Внезапно ни запятой, ни массива компьютер не видит. И лишь интерпретируя единички, их наличие в заданном месте, он даёт нам то что мы считаем плавающей запятой.
Аноним 20/09/21 Пнд 20:58:18 25473355487
в говне моченые напридумывали хуиты, теперь ебать мозг надо из-за них, выебал бы их всех в жопы
Аноним 20/09/21 Пнд 20:58:48 25473358088
>>254733534
Нет, для компьютера не существует никаких единичек. Есть только массивы битов.
Аноним 20/09/21 Пнд 20:59:23 25473361189
>>254727875
Оно записывается в двоичной системе, поэтому не всегда возможно записать точное значение. Например, 11.62510 в двоичной представляется как 1011.1012, и соответственно оно может быть записано точно как в double, так и во float. В то же время, например, 1.210 в двоичной системе счисления может быть записано только в виде бесконечной периодической дроби: 0.001100110011...2 = 0.(0011)2. Кроме того, количество цифр после (и перед) запятой конечное, поэтому даже те числа, которые в двоичной системе имеют конечное число цифр после запятой, не всегда могут быть записаны точно даже в long double (10 байт).
Аноним 20/09/21 Пнд 21:00:45 25473369790
>>254733580
Массивы битов это выдуманная людьми условность, так как они не способны смириться с тем что компьютер это супер быстрый Абу который считает всё палочками.
Аноним 20/09/21 Пнд 21:05:04 25473397891
>>254733697
Не такой уж и быстрый. Если его заставить считать именно единичками и ноликами, то будет раз в десять медленнее, чем операции над массивами битов на специализированных вычислительных блоках. Сейчас вот в видимокартах пошла мода на половинную точность, потому что тогда массив битов, приходящих в блок короче и вычислять получается быстрее.
Аноним 20/09/21 Пнд 21:07:01 25473407792
>>254733978
Пойми, вычислительные блоки это Абу с покрашенными палочками: он считает единички, а ты их интерпретируешь не так как Абу. Но реальность такова что это единички, даже если ты завёл для этого отдельного Абу и посадил его в отдельный обезьянник.
Аноним 20/09/21 Пнд 21:07:01 25473407893
>>254733611
>В то же время, например, 1.2 в двоичной системе счисления может быть записано только в виде бесконечной периодической дроби:
Почему нельзя записать 1.10?
Аноним 20/09/21 Пнд 21:09:17 25473420894
>>254734077
На самом нижнем уровне нет никакого абу. Есть только биты.
Аноним 20/09/21 Пнд 21:09:48 25473424495
Аноним 20/09/21 Пнд 21:10:17 25473427596
>>254733611
>Кроме того, количество цифр после (и перед) запятой конечное, поэтому даже те числа, которые в двоичной системе имеют конечное число цифр после запятой, не всегда могут быть записаны точно даже в long double (10 байт).
Хуйня какая-то, любое двоичное число переводится в десятичное.
Вот есть же
0 = 0
1 = 1
10 = 2
11 = 3
100 = 4
101 = 5 и так далее. Почему нельзя точно записать?
Аноним 20/09/21 Пнд 21:10:48 25473430297
Аноним 20/09/21 Пнд 21:10:57 25473431098
>>254734275
Это целые числа. С дробными так нельзя.
Аноним 20/09/21 Пнд 21:11:09 25473431899
>>254733396
> 1e-3
Это десятичная экспоненциальная запись. Один умножить на десять в минус третьей. Сохранить ее без потери точности в двоичной экспоненциальной записи нельзя.

>+1 степень, это ясно.
+1 это знак, положительное

>степень 1013 - это что? Это в десятичном выражении или как?
Это десятичное беззнаковое, просто как если бы биты означали целое неотрицательное число (0-2047). Но показатели бывают отрицательные (-1023 - +1024), поэтому из него надо вычесть 1023 (получится минус десять).

> 0.0009765625
Это два в степени минус десять

> Что такое 1.024
Мантисса.

> Откуда это число взялось?
В момент float x = 1e-3; происходит конверсия.

> Почему основание степени - двойка
Коротко, по стандарту. Стандарт такой потому что так считать эффективнее.
Аноним 20/09/21 Пнд 21:11:21 254734334100
>>254734208
Биты это палочки, единички, которые перебирает Абу из-за того что к нему под хвост поступают электросигналы.
Аноним 20/09/21 Пнд 21:14:01 254734469101
>>254734302
Ты не знаешь, как работают позиционные системы счисления.
1.1012 = 1 20 + 1 2-1 + 0 2-2 + 1 2-3 = 1.62510
Аноним 20/09/21 Пнд 21:15:51 254734561102
>>254734469
>>254734302
Блядь, разметка.
1.1012 = 1 × 20 + 1 × 2-1 + 0 × 2-2 + 1 × 2-3 = 1.62510
Аноним 20/09/21 Пнд 21:16:09 254734583103
>>254734334
Нет никаких палочек. Биты это конденсаторы и транзисторы. Нули и единицы это уже для человека выдумано. Есть только биты.
Аноним 20/09/21 Пнд 21:17:07 254734638104
>>254734318
>+1 это знак, положительное
Да, у меня башка уже кружится от этого гавна
>(получится минус десять)
Почему нам нужно именно минус десять?
>Это два в степени минус десять
Это я понял, только откуда здесь минус десять то высралось.
>Мантисса.
Что мантисса? Мантисса это 1 в числе 1e-3. Что за 1.024?
>Коротко, по стандарту. Стандарт такой потому что так считать эффективнее.
Вообще ничего непонятно.
Аноним 20/09/21 Пнд 21:19:31 254734764105
>>254734583
Единица есть сигнал, нет - нет. Это не бит, а единица, так как комп не умеет читать нули. Но благодаря интерпретации мы можем учитывать отсутствие единиц в определённых местах и так привязываем одни единички - к другим.
Аноним 20/09/21 Пнд 21:20:40 254734823106
Аноним 20/09/21 Пнд 21:21:30 254734855107
>>254734318
>Сохранить ее без потери точности в двоичной экспоненциальной записи нельзя.
А как же тогда в памяти хранится?
Аноним 20/09/21 Пнд 21:23:02 254734941108
>>254734855
В виде единичек, целочисленных беззнаковых единичек.
Аноним 20/09/21 Пнд 21:24:53 254735043109
>>254734941
Смотри пишу:
1E-3
Опа, как же я это сделал? Ведь по логике сейчас на экране я должен увидеть 1.00000000012489124E-3, но я вижу 1E-3.
Аноним 20/09/21 Пнд 21:24:54 254735046110
>>254734638
> Что мантисса? Мантисса это 1 в числе 1e-3. Что за 1.024?
В десятичной записи этого числа мантисса это 1. В двоичной - 1.024 (а показатель - минус десять).
Просто перевели из десятичной системы счисления в двоичную, потому что по стандарту/определению float и double записываются в двоичной.
В процессе перевода точность потерялась.
Аноним 20/09/21 Пнд 21:26:36 254735142111
>>254735046
>В двоичной - 1.024
Начнем с того, что в двоичной нет "2" и "4".
Аноним 20/09/21 Пнд 21:26:55 254735157112
>>254734855
>>254735043
В исходниках оно хранится текстом:
float x = 1E-3;
После компиляции (и соответственно при выполнении) точность уже потеряна.
Аноним 20/09/21 Пнд 21:28:19 254735229113
>>254735142
Не в двоичной системе счисления, а в двоичной экспоненциальной записи, как на оповых скринах.
Аноним 20/09/21 Пнд 21:33:51 254735518114
Короче понятно, что нихуя непонятно, пиздец
Аноним 20/09/21 Пнд 21:37:49 254735712115
>>254735157
>В исходниках оно хранится текстом:
Спрошу по-другому, мне в программу приходит 4 байта, являющихся числом с плавающей точкой Я никак не могу изменить формат получения данных, НЕ текст, а именно 4 байта.
Мне нужно превратить их в 8 байт для обработки.
Аноним 20/09/21 Пнд 22:00:27 254736880116
бамп
Аноним 20/09/21 Пнд 22:05:43 254737113117
Аноним 20/09/21 Пнд 22:10:27 254737358118
>>254735518
Ну чел, нельзя просто взять и в двух словах на двачах объяснить, как устроены числа с плавающей запятой. Особенно тому, кто не знает про системы счисления. Продолжай разбираться, гугли, читай всякие статьи на хабре на эту тему. В какой-то момент дойдет. Для начала осознай, что ответа на вопрос, как это сделать, не будет пока ты не поймешь, как это устроено.
Аноним 20/09/21 Пнд 22:13:44 254737529119
Аноны, поясните за float-fingerprint.
Аноним 20/09/21 Пнд 22:18:38 254737836120
>>254737358
Я примерно понял, не могу понять другую вещь, почему нельзя округлить число до определенной точности? Ну то есть если я отбрасываю в мантиссе даже последний бит, то получаю огромное неадекватное число. Как правильно округлять то?
Аноним 20/09/21 Пнд 22:20:07 254737931121
>>254737836
Как именно ты его "отбрасываешь"? Приведи пример.
Аноним 20/09/21 Пнд 22:21:48 254738026122
>>254737931
10010001 например
делаю 10010000
Аноним 20/09/21 Пнд 22:26:14 254738298123
>>254738026
Я имел ввиду, приведи число полностью. Это 8 бит, которые в начале, после знака? Это не мантисса, а показатель степени. Мантисса это последние 23 бита.
Аноним 20/09/21 Пнд 22:29:50 254738521124
image.png 30Кб, 1311x288
1311x288
image.png 37Кб, 1276x331
1276x331
>>254738298
>Это не мантисса, а показатель степени. Мантисса это последние 23 бита.
Я знаю, я просто пример привел.
>Я имел ввиду, приведи число полностью.
Ну вот например пикрелейтед.
Последнюю "с" поменял на 0. Мантисса превратилась в огромный пиздец.
Вопрос как именно сделать так, чтобы было 0.001.
Аноним 20/09/21 Пнд 22:30:30 254738567125
>>254738298
Не показатель степени, а порядок, если точнее. Показатель степени у float это порядок (8-битное значение) минус 127.
самофикс
Аноним 20/09/21 Пнд 22:32:53 254738703126
>>254738521
Так а что не так? Это нормально. Ты немного поменял значение мантиссы в хвосте и число стало немного другим: 0.001 ~ 0.000999...
Аноним 20/09/21 Пнд 22:33:43 254738748127
>>254738703
>Вопрос как именно сделать так, чтобы было 0.001.
Аноним 20/09/21 Пнд 22:34:08 254738775128
>>254738521
> Вопрос как именно сделать так, чтобы было 0.001.
Забудь про точность. Этот формат в принципе ее не гарантирует.
Аноним 20/09/21 Пнд 22:35:24 254738853129
image.png 30Кб, 1311x288
1311x288
Аноним 20/09/21 Пнд 22:37:29 254738995130
>>254738775
И вопрос был не про точность, а про то как округлить. Точность не нужна, нужна нормальная цифра, без 99999999999999999999999999999
Аноним 20/09/21 Пнд 22:39:24 254739105131
>>254738748
Вот смотри, ты хочешь представить в двоичной системе число 1/1000, которое в десятичной системе выражается точно как 0.001 = 1 × 10-3. В двоичной системе счисления это не выражается конечной дробью: 0.00110 = 0.00000110001...2. Поэтому это число просто нельзя представить точно ни в float, ни в double.
Аноним 20/09/21 Пнд 22:41:08 254739210132
>>254739105
Ты врешь, я вижу на экране переменную типа float со значением 1E-3.
Аноним 20/09/21 Пнд 22:41:36 254739236133
>>254738995
Как округлить при выводе, то есть? Это уже совсем про другое вопрос. Изначально ты спрашивал именно про тип float.
Аноним 20/09/21 Пнд 22:42:18 254739274134
>>254739210
Ну да, при выводе она округляется
> Ты врешь
Лол
Аноним 20/09/21 Пнд 22:43:49 254739352135
>>254739274
Каком выводе? Я прямо через отладчик смотрю, там значение 1e-3.
Аноним 20/09/21 Пнд 22:46:51 254739514136
>>254739236
Ну и как же округлить при выводе? Только мне не надо в строку переводить.
Аноним 20/09/21 Пнд 22:47:12 254739534137
>>254739352
Блядь, так он тебе и вывел в читаемом нахуй формате, ебать. Ебаный отладчик округлил ебучую дробь, потому что блядское отклонение очень маленькое, что тебе непонятно?
Аноним 20/09/21 Пнд 22:50:53 254739732138
>>254739514
Тебе же вроде надо было преобразовать float в double, не? Или ты не ОП? Как округлить при выводе - совсем отдельный вопрос. Что конкретно тебе надо сделать?
Аноним 20/09/21 Пнд 22:53:06 254739845139
>>254739732
Если тебе надо преобразовать float в double, тебе не надо ничего округлять. Тебе нужно просто корректно скопировать мантиссу, порядок и знак.
Аноним 20/09/21 Пнд 23:24:10 254741253140
>>254739845
Ну я копирую и получается хуета.
Аноним 20/09/21 Пнд 23:33:47 254741663141
ладно, челики, так и быть, напишу
float в double в языке си приводится неявно, это присваивающее приведение, вам не требуется явного преобразования (double)
второе, с вероятностью 95% на современных платформах будет использоваться явная машинная команда преобразования, например под x86-64 это будет ассемблерная команда cvtss2sd, будет задействован сопроцессор - модуль операций с плавающей точкой
Аноним 20/09/21 Пнд 23:36:16 254741775142
>>254725792 (OP)
Лучше всего вообще ничего не конвертировать, а сразу использовать double. Ну или float, если исходные данные в нём.
Аноним 20/09/21 Пнд 23:39:07 254741906143
>>254741663
но если опу очень хочеться с учебной целью сделать такое приведение руками, то вот подсказка: нужно использовать struct с union внутри для того чтобы получить плоское представление float и double в памяти, а потом уже таким образом получив доступ к внутреннему представлению вещественных чисел, написать алгоритм преобразования ручками
внутреннее представление float и double в x86-64 легко гуглиться, как и алгоритм преобразования
вообще, если подобные задания тебе дают в вузике, то это хороший вуз и хороший препод


Аноним 20/09/21 Пнд 23:40:58 254741977144
>>254727875
Тип с плавающей точкой не может хранить непрерывное множество чисел, поэтому некоторые значения могут быть представлены в нём только как приближения к желаемым. Поэтому, плавающую арифметику категорически нельзя использовать, например, для денежных величин, где погрешность в принципе недопустима.
Аноним 20/09/21 Пнд 23:44:13 254742119145
Оп, ты же тоже уебище что и про умножение на ноль затирал? У вас одинаковый шизоидный стиль письма.
Аноним 20/09/21 Пнд 23:45:48 254742178146
>>254741775
А если исходные данные в float, нужно преобразовать, обработать и передать в другое место, но уже в double?
Аноним 20/09/21 Пнд 23:53:08 254742485147
>>254741253
Неправильно копируешь, значит. Учти еще, что там бывают особые случаи, когда порядок минимальный (денормализованная форма записи числа) или максимальный (частные случаи: бесконечность, не-число). Разберись подробнее. Вот тебе пример:

29,53125

float
0'10000011'11011000100000000000000

double
0'10000000011'1101100010000000000000000000000000000000000000000000
Аноним 20/09/21 Пнд 23:55:56 254742595148
>>254742485
У double показатель степени = порядок (11 бит) минус 1023
Аноним 21/09/21 Втр 00:01:00 254742814149
>>254742485
Ты можешь подробно написать какие математические операции ты сделал чтобы получить мантиссу и показатель?
Аноним 21/09/21 Втр 00:26:45 254743748150
>>254742814
> 29,53125

> float
> 0'10000011'11011000100000000000000

> double
> 0'10000000011'1101100010000000000000000000000000000000000000000000

S = 0 (положительное)
E = 100000112 = 131

0 < E < 255, следовательно число нормализованное (обычное, то есть), значит число имеет вид +-1,M × 2E - 127:

+1,11011000100000000000000 × 2131 - 127 = 1,110110001 × 24 = 11101,100012 = 29,53125

Преобразование в double:
1) копируем 1 бит со знаком
2) следующие 11 бит E' = E - 127 + 1023 = (131 - 127) + 1023 = 4 + 1023 = 1027 = 100000000112
3) мантису копируем как есть, заполняя нулями хвост
Аноним 21/09/21 Втр 00:32:40 254743948151
>>254743748
Для денормализованных чисел типа float (E = 0) все по-другому, потому что они, в отличие от нормализованных, имеют вид 0,M × 2-126. Денормализованные числа типа double, соответственно: 0,M' × 2-1022. Поэтому денормализованный float придется преобразовать в нормализованный double (E' > 0), который имеет вид 1,M' × 2E' - 1023, то есть эту неявную единичку нужно в таком случае брать в расчет.
Аноним 21/09/21 Втр 00:33:32 254743973152
>>254727514
>Например есть float 1.73
>Я перевожу в double и получаю 1.7299999935683924 вроде такой хуйни.
- Сколько программистов нужно, чтобы вкрутить лампочку?
- 1.9946938293545, но это приемлемая точность.
Аноним 21/09/21 Втр 00:36:57 254744086153
>>254741977
>Поэтому, плавающую арифметику категорически нельзя использовать, например, для денежных величин, где погрешность в принципе недопустима.
Раз уж подняли такую тему, как на ЦПП делать арифметику с фиксированной точкой с минимальным количеством костылей?
коллеги по разработке звукового движка кидают в меня тухлыми помидорами за использование uint, который надо сдвигать, но продолжают им пользоваться
Аноним 21/09/21 Втр 00:44:02 254744331154
Жалко, что тред утонет
Аноним 21/09/21 Втр 01:56:30 254746291155
>>254728458
покормите зелёного братишку
Настройки X
Ответить в тред X
15000
Макс объем: 20Mб, макс кол-во файлов: 4
Кликни/брось файл/ctrl-v
X
Ваш шидевор X
Стикеры X
Избранное / Топ тредов