LINUX.ORG.RU
решено ФорумTalks

питонопроблемы

 ,


2

3

чему у вас равно 3.11 + 2?

UPD: протупил, причина то тривиальная, забыл, что в double порядки двоичные, теперь разбираюсь, почему 5.11 = 5.11

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 2)

Ответ на: комментарий от i-rinat

Ты знаешь, как она работает?

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

Можешь в точности расписать алгоритм работы? Описание, достаточное для создания сторонним человеком реализации с точно таким же поведением Write().

Эта процедура работает с системой написанной на С/С++, а значит в какой-то мере зависит от дурдома творящегося в среде сиплюсоразработки. Она предоставляет не укуренный интерфейс к тому дурдому. Ты просто тупо пользуешься тем, что у меня прямо сейчас нет под рукой более-менее нормального поисковика типа kfind (в игровой ОС гуано а не поиск) по файлам и задаёшь задания на поик информации, в которых он нужен. Описание нужно искать в исходниках, а поиск работает - в линуксе. И зачем создавать ещё один Write() если он уже есть?

Napilnik ★★★★★
()
Последнее исправление: Napilnik (всего исправлений: 1)
Ответ на: комментарий от Napilnik

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

Не вижу этого знания. Ты его явно тщательно скрываешь.

И зачем создавать ещё один Write() если он уже есть?

Не нужно создавать ещё один Write(). Нужно описать работу Write() на достаточно подробном уровне. Достаточно подробный уровень это уровень, достаточный для реализации точно такой же функции. Пространные рассуждения о том, на чём там это реализовано и что использует, не являются описаниями достаточного уровня, так как не позволяют реализовать функцию с точно таким же поведением.

Описание работы Write() нужно для того, чтобы понимать, как эта функция работает.

i-rinat ★★★★★
()
Ответ на: комментарий от Napilnik
<+Skerper> I remember once in first year CS
<+Skerper> this guy asked me to tutor him
<+Skerper> was absolutely devastated that he'd gotten a 0 for his programming assignment
<+Skerper> so he shows it to me
<+Skerper> and he's literally written an essay on how to make the program
<nugyflex> what the fuck
<+Skerper> complete with stock images and references
<BlackMoon> hahah
<+Jattenalle> haha, aaw
<+Skerper> but no actual program
<nugyflex> ahahha
<+Jattenalle> poor innocent little child
<+Skerper> Never had such an «oh sweety» moment in my life
<nugyflex> how does that happen
<+Skerper> I have no fucking idea, it was the most awkward thing
<nugyflex> how can that possibly happen...
<+Skerper> I don't know how he got it into his head that that was the assignment
<+Skerper> considering it had to be handed up to an automarker
<+Skerper> that compiles it and tests output
<nugyflex> Oooo nooo
<nugyflex> tries to compile essay
<nugyflex> rip
i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

Без понимания реализации и с чем оно стыкуется, ты сможешь реализовать _процедуру_ с точно таким же поведением разве что рандомом.

Описание работы Write() нужно для того, чтобы понимать, как эта функция работает.

Так читай официальную документацию данной процедуры, там есть её описание достаточное для применения - как прочитаешь, так сразу и «поймёшь» как она работает.

Napilnik ★★★★★
()
Ответ на: комментарий от i-rinat

Диалоги Бивиса и Батхеда на МТВ? Потому что иного смысла в твоей копипасте - НЕТ. Мои примеры компилируемые и работоспособные, а вот ты говоришь непонятно о чём, ли бы возразить, в стиле - «а Баба Яга - против».

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Так читай официальную документацию данной процедуры

Ты не понял. Не мне нужно описание, оно нужно в первую очередь тебе. Сейчас для тебя это всё просто магия, которую ты не понимаешь, и даже не стремишься понять. Write() напечатал тебе «5.11», и всё, ты уверовал в абсолютную точность double.

там есть её описание достаточное для применения - как прочитаешь, так сразу и «поймёшь» как она работает.

Странно считать, что описание для пользователей даст понимание внутреннего устройства.

Подумай внимательно. Числа с плавающей точкой определяются в двоичном виде. А на печать выводятся в десятичном виде. Существует ли взаимно-однозначное соответствие между этими представлениями?

i-rinat ★★★★★
()
Ответ на: комментарий от Napilnik

Диалоги Бивиса и Батхеда на МТВ?

Иллюстрация к тебе. Столько слов написал, а детального описания алгоритма работы Write() как не было, так и нет.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Иллюстрация к тебе. Столько слов написал, а детального описания алгоритма работы Write() как не было, так и нет.

Ты путаешься в показаниях - уж не пьян ли? То тебе нужен был вывод числа из 15 знаков, а как только его получил, так сразу забугуртил, что там не 3 знака. Когда получил и это - забугуртил про понимание Write(), хотя в моём примере именно этой процедуры и не было. Когда понимание было тебе продемонстрировано, ты забугуртил про описание, без которого якобы не может быть понимания работы, теперь вот про алгоритмы забугуртил. У тебя всё в порядке, или ты тупо подгоняешь ветку обсуждения под снос чтобы твой и питоновский фейлы почистить?

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Ты путаешься в показаниях

Нет, общая канва всё так же. Я пытаюсь подойти с разных сторон, чтобы нащупать вариант, который тебе будет понятен. Пока безуспешно, но я стараюсь.

Write(), хотя в моём примере именно этой процедуры и не было

Этим ты подтверждаешь, что в код реализации Writeln() ты точно не смотрел. :-D

про описание, без которого якобы не может быть понимания работы

И где описание? Ты всё ещё пишешь сочинения об этом? Так сложно в код FPC заглянуть?

про алгоритмы

Какие алгоритмы?

i-rinat ★★★★★
()
Ответ на: комментарий от Napilnik

А типы переменных для чисел с запятой Real, Single, Double, Extended (задействовано 10 байтов), Comp, Currency придуманы не в нашей галактике? Вывод: если хочешь предсказуемой точности, то используй нормальные ЯП а не скриптовые средства для автоматизации логики в играх, написанные на куче чужих ЯП, со множеством уникальных патчей в каждом дистрибутиве. Реально, если программа на питоне написана в дистрибутиве X, то как ожидать что она так будет работать и в Y? Бубунтопрограмма на сях хоть с большой вероятность свалится с сегфолтом в другом дистре, а эти скриптоязыки придуманы чтобы при глюках продолжать работу, вот они и работают - считают с багами «длиннейшие» числа из трёх знаков.

Точность вычислений зависит от того, как ты заранее подготовил эти вычисления, с учетом специфики АЛУ.

dikiy ★★☆☆☆
()
Ответ на: комментарий от i-rinat

Ты не понял. Не мне нужно описание, оно нужно в первую очередь тебе. Сейчас для тебя это всё просто магия, которую ты не понимаешь, и даже не стремишься понять. Write() напечатал тебе «5.11», и всё, ты уверовал в абсолютную точность double.

Во первых, не Write() а Writeln() - это как Write() но в конце сообщения добавляется маркер конца строки. Вместо Writeln(A) в линуксе можно написать Write(A,#10) и будет тот же эффект. А для более кроссплатформенного действия - Write(A,#13#10)

А во вторых, я знаю, что там используется как минимум Extended, который ещё точнее, а потом результат округляется/усекается до Double. Процессоры на ПК научились работать с Extended, чем ЯП и пользуется для быстроты.

Ну и для кого тут магия?

Подумай внимательно. Числа с плавающей точкой определяются в двоичном виде. А на печать выводятся в десятичном виде. Существует ли взаимно-однозначное соответствие между этими представлениями?

Ничего не знаю про определение числа именно в двоичном виде - это твои домыслы. Ещё раз: для хранения компактнее использовать типы Single и Double, а для обработки конвертить их в Extended и скармливать x86_64 процессору имеющий встроенный сопроцессор для чисел с плавающей запятой. Если сопроцессора нет, то его надо эмулировать. А вот как сопроцессор представляет число в формате Extended, нам сейчас ломать голову не нужно - мы если проц и изобретём, то напечатать компактно не сможем. А что до вывода на печать, то можно вывести и альтернативным способом:

var
s:ansistring;
i:double;

begin;
i:=5.11;
str(i,s);
writeln(s);
i:=5.2345678901234567890;
str(i,s);
s:=s+' морда, морда - я кирпич, иду на посадку.';
writeln(s);
end.
$ ./iii
 5.11000000000000E+000
 5.23456789012346E+000 морда, морда - я кирпич, иду на посадку.

На печать подаётся не число а строка, а результат всё тот же что и в прошлых тестах. Следовательно и при обработке число сохраняет необходимую точность. А сколько транзисторов процессора для этого пыхтят, не всё ли равно - они там для этого уже существуют, и кушают они не как радиолампы.

Если бы ты не знанимался намёками, то сэкономили бы много букв и цифр.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

В питоне числа с плавающей точкой — точно такой же дабл что и в твоём паскакале. Аналог writeln в питоне — print. И точно так же как в паскакале, в питоне принт спрячет от тебя суровую правду чисел с плавающей точкой:

$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1+0.2
0.30000000000000004
>>> print(0.1+0.2)
0.3
PolarFox ★★★★★
()
Ответ на: комментарий от dikiy

Точность вычислений зависит от того, как ты заранее подготовил эти вычисления, с учетом специфики АЛУ.

В персоналках есть встроенный математический сопроцессор и им можно пользоваться - всё равно деньги за него уже уплачены при покупке устройства:))) На древних персоналках вместо сопроцессора бывал пустой слот, а сейчас он уже встроен в процессор. Вот у видух с типами Double и Extended не всё так хорошо.

Napilnik ★★★★★
()
Ответ на: комментарий от PolarFox

Чукча не читатель, чукча писатель? Да, писюн тебя обломал, обидно, досадно, но читать сообщениz на которые отвечаешь, всё равно надо. Про тип Extended там было написано вполне конкретно, мог бы и поискать про него информацию. Твои вычисления на паскале, вывод и через строку и напрямую:

var
s:ansistring;
i:double;

begin;
i:=0.1+0.2;
writeln(i);
str(i,s);
writeln(s);
writeln(0.1+0.2);
end.

Выхлоп:

$ ./iii2
 3.00000000000000E-001
 3.00000000000000E-001
 3.0000000000000000E-0001
На 15 знаках для Double и 17 для Extended в паскале всё нормально, а зачем писюн не усекает восемнадцатый знак со всяким мусором - спроси у его разработчиков обчитавшихся непротестированных стандартов.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

для хранения компактнее использовать типы Single и Double, а для обработки конвертить их в Extended

Учи матчасть, дурачок. Ну сколько тебя уже можно носом тыкать? Там всё та же мантисса, всё та же экспонента.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Лузер даже на нашёл статьи на нормальном языке? Тебе надо, ты свои какашки переводи и читай, а у меня всё нормально работает - 15 знаков для Double и 17 для Extended. В Борланде люди поумнее тебя почесали репы и всё сделали, а ты тут бегай с мятой туалетной бумагой зогопедией.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

и чё?

uses sysutils;

var
x: double;
y: extended;
s:ansistring;

begin
x := 0.2;
y := 0.2;
writeln('FloatToStr(x) = ', FloatToStr(x));
str(x, s);
writeln('str(x, s) =', s);
writeln('x =', x);
writeln;
writeln('FloatToStr(y) = ', FloatToStr(y));
str(y, s);
writeln('str(y, s) =', s);
writeln('y =', y);
writeln;
x := 0.2 + 0.1;
writeln('0.2+0.1 =', x);
end.

>fpc ./test.pas
...

>test

FloatToStr(x) = 0.2
str(x, s) = 2.0000000000000001E-00
x = 2.0000000000000001E-001

FloatToStr(y) = 0.2
str(y, s) = 2.00000000000000000003
y = 2.00000000000000000003E-0001

0.2+0.1 = 2.9999999999999999E-001
grem ★★★★★
()
Ответ на: комментарий от Napilnik

На 15 знаках для Double и 17 для Extended

3.00000000000000E-001
3.0000000000000000E-0001

Не знаю, что у тебя там за «паскаль», но я вижу у тебя в выводе 14 и 16 знаков после точки, но никак не 16 для double и для extened даже 17 знаков что-то маловато. Наверное, разработчики используемого тобой компилятора берегли психику таких как ты и обрезали вывод.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от Napilnik

Во первых, не Write() а Writeln()

facepalm. Посмотри уже в код.

Если бы ты не знанимался намёками

Тебе тут несколько человек прямым текстом писали, и я в том числе. Как об стенку горох.

i-rinat ★★★★★
()
Ответ на: комментарий от grem

и чё?

И то. Ты хоть указывай, на каком компиляторе получил своё безобразие. Потому что у тебя в выводе последнего числа наблюдается 2 лишних знака, баг какой-то, который фиксить надо, если версия свежая. У меня, на fpc 2.6.4 выхлоп такой:

$ ./z2
FloatToStr(x) = 0.2
str(x, s) = 2.00000000000000E-001
x = 2.00000000000000E-001

FloatToStr(y) = 0.2
str(y, s) = 2.0000000000000000E-0001
y = 2.0000000000000000E-0001

0.2+0.1 = 3.00000000000000E-001
Napilnik ★★★★★
()
Последнее исправление: Napilnik (всего исправлений: 1)
Ответ на: комментарий от grem

Не знаю, что у тебя там за «паскаль», но я вижу у тебя в выводе 14 и 16 знаков после точки, но никак не 16 для double и для extened даже 17 знаков что-то маловато.

Что нормально. Незачем в готовом результате использовать ячейки памяти используемые как мусорник. В Борланде придумали как изящно, быстро и в десятичной форма складывать десятичные же дроби. А в писюне, по какому-то замшелому стандарту, придуманному теоретиками, лепят ошибки на ровном месте - стыд им и срам! По утрам и вечерам.

Napilnik ★★★★★
()
Ответ на: комментарий от i-rinat

Во первых, не Write() а Writeln()

facepalm. Посмотри уже в код.

В моём коде Writeln() - очки протри.

Тебе тут несколько человек прямым текстом писали, и я в том числе. Как об стенку горох.

Так обкакались оппоненты, не смогли свою точку зрения доказать. Ну так обтекайте или ищите аргументы.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

а у меня fpc 3.0.2

у меня на выводе указано 16 знаков после десятичной точки, это и есть «точность» при выводе «с экспонентой», то что стоит перед точкой при этом не учитывается при подстчёте знаков. У тебя же выводится всего 14 знаков, т.е. они намеренно прячут то, что осталось при выводе. И последний знак вполне себе значимый и правильный, если перевод числа в эквивалентную двоичную запись не приводит к появлению периодической последовательности, как в приведённых выше примерах. В «борланде» ничего не придумали, они просто отрезают пару значащих цифр, хорошо, если только при выводе, чтобы крыша не поехала у начинающих, (хорошо если при выводе?) иначе из-за таких вот фокусов можно быстро накопить большую вычислительную ошибку. Но ты продолжай верить, что они используют какие-то особые «десятичные» числа, а не их двоичное представление. Можешь проверить на fpc 3.0.2 ... ну, и где теперь твой «борланд», когда он тебе так нужен?

grem ★★★★★
()
Ответ на: комментарий от Napilnik

В моём коде Writeln() - очки протри.

В код стандартной библиотеки FPC посмотри, на реализацию Writeln(). Какой же ты тугой...

i-rinat ★★★★★
()
Ответ на: комментарий от grem

а у меня fpc 3.0.2

Какой-то бракодел проник и запилил неправильный патч. Не иначе сионисты с питонистами совершили диверсию, надо будет узнать подробности.

У тебя же выводится всего 14 знаков

Всего - 15, т.к. на знак перед запятой тоже тратятся биты.

И последний знак вполне себе значимый и правильный, если перевод числа в эквивалентную двоичную запись не приводит к появлению периодической последовательности, как в приведённых выше примерах.

Ты из секты математиков? Потому что только им начхать на возможности железа - подавайте им математику как на бумажке с карандашом. А в реальном железе могут быть и ячейки для мусора.

В «борланде» ничего не придумали, они просто отрезают пару значащих цифр, хорошо, если только при выводе, чтобы крыша не поехала у начинающих,

Они сделали зашибись - у них машинная математика работает как надо.

Но ты продолжай верить, что они используют какие-то особые «десятичные» числа, а не их двоичное представление.

Тебе ясно было сказано как двоичные превращаются в десятичные - путём усечения «хвостика» с мусорником. Но ты продолжай таскать хавку из помойки из принципа и доказывать что там она самая правильная.

Можешь проверить на fpc 3.0.2 ... ну, и где теперь твой «борланд», когда он тебе так нужен?

Кто-то запилил в мажорный релиз баг, подробности сей диверсии пока не узнавал. Если баг несознательный, то надо направить патч в апстрим и исправить.

Napilnik ★★★★★
()
Ответ на: комментарий от i-rinat

В код стандартной библиотеки FPC посмотри, на реализацию Writeln(). Какой же ты тугой...

Ты мне вчера втирал что тебе код реализации не нужен. За ночь сменил ориентацию?

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

нет, похоже, что ты не прикидываешься

Тебе ясно было сказано как двоичные превращаются в десятичные - путём усечения «хвостика» с мусорником.

хахаххаа, усечения хвостика от чего? ты с самой процедурой перевода числа в двоичное знаком?

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от Napilnik

Ты мне вчера втирал что тебе код реализации не нужен.

Тебе не приходило в голову, что я уже туда давно посмотрел и знаю, как это реализовано?

Это всё тебе, в общем-то, нужно. Конечно, если ты предпочитаешь оставаться в невежестве, твоё право. Продолжай оставаться посмешищем, если тебе так удобнее.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Тебе не приходило в голову, что я уже туда давно посмотрел и знаю, как это реализовано?

Что ты там видел не имеет решающего значения, поскольку нормально осмыслить увиденное так и не смог.

Это всё тебе, в общем-то, нужно. Конечно, если ты предпочитаешь оставаться в невежестве, твоё право. Продолжай оставаться посмешищем, если тебе так удобнее.

Ты же обкакался в своём «вежестве» и очень доставляешь своими наивными попытками облапошить.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Какой-то бракодел проник и запилил неправильный патч. Не иначе сионисты с питонистами совершили диверсию, надо будет узнать подробности.

Жир начал сочиться из системного блока рано утром. Солнце только показалось из-за горизонта, запели первые утренние пташки, а под компом уже была порядочная жирная лужа. Я не понимал в чём причина этого явления и просто протёр лужу. Когда я включил компьютер, жир начал вытекать уже и из монитора тонкой но непрерывной струёй. Я терпел, я думал это пройдёт. Но всё же была непонятна причина столь активного жироотделения. Когда я зашёл на лор, жир потёк таким потоком что нужно было подставлять тазик под монитор и системник и выносить их каждые 20 минут. Потом я открыл этот тред... Это было нечто невообразимое, это был уже не поток, это было какое-то цунами жира! Он хлынул из компа, ничто уже не могло его остановить! Поток жира нёсся, снося всё на своём пути. Не знаю каким чудом мне удалось уцелеть, ибо от моего дома остались одни руины, двор сейчас похож на пустыню с барханами из жира. Погибли люди, некоторые лишились крыши над головой. Napilnik, что же ты наделал?

Akari
()
Ответ на: комментарий от grem

усечения хвостика от чего?

От массива битов.

ты с самой процедурой перевода числа в двоичное знаком?

Ассемблер и машинные коды тут не при чём. Как бы там не реализовывалось, но при достатке ресурсов подобрать подходящий вариант - можно.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Сам я в код не смотрел и смотреть не собираюсь, но готов поспорить на $20, что Writeln внутри таки вызывает Write.

Akari
()
Ответ на: комментарий от Akari

Сам я в код не смотрел и смотреть не собираюсь, но готов поспорить на $20, что Writeln внутри таки вызывает Write.

А кто-то утверждал обратное? Выше по тексту говорил чем они отличаются и как вместо Writeln использовать Write, но господа тут просто гонят волну в попытке запутать и облапошить. Тот же Иринат избрал тактику поменьше говорить конкретностей, чтобы за базар не притянули, и побуждать оппонента поискать баги в своей точке зрения самому - авось чего у себя найдёт, а навар с этого он получит.

Napilnik ★★★★★
()
Ответ на: комментарий от grem

ты не поверишь

И что? Компилятор 2.6.4 выдаёт точный результат, а 3.0.0 на том же примере - неточный. Это баг. А откуда он там появился, надо выяснять.

Napilnik ★★★★★
()
Ответ на: комментарий от grem

Когда окошко иде при уменьшении размера но 0 делило, таки научил. Теперь делит без ошибки.

Napilnik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.