LINUX.ORG.RU

Выкрутасы от gnuplot


0

2

Даем команду построить две одинаковые функции двумя разными способами:

plot  sqrt(1+x**(-1/3)), sqrt(1+(1/x)**(0.33333333333333))

Получаем бред:

WTF??

Как на нем можно вообще работать, если он лажает на таких простых примерах?

Version 4.4 patchlevel 0


Ответ на: комментарий от Heretique
plot  sqrt(1+x**(-1/3.)), sqrt(1+(1/x)**(0.33333333333333))

Действительно, очень логично.

Интересно, хоть кто-нибудь вменяемый хоть раз иcпользовал эту фичу гнуплота с целочисленным делением?

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

Си тоже также работает. Пока специально во float не сконвертируешь, если все операнды int, то и результат будет int. Сразу видно, не программер ))

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

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

Хотя спорить не буду, если голову растить в ящике то она станет-таки квадратной.

mclaudt
() автор топика
Ответ на: комментарий от Heretique

Да, кстати, где логика?

1/3. = 0.3333
1/3 = 0

но:

log(3.) = 1.0986
log(3) = 1.0986

Что, с этим смирится профессиональный программист? Нет, с этим смирится только профессиональный кретин.

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

Логарифм как функция из int в int лишён всякого смысла. Поэтому аргумент неявно приводится к вещественному типу, и результат выдаётся вещественный.

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

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

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

Тогда уж log() должно проводить дискретное логарифмирование по такой аналогии.

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

> Тогда уж log() должно проводить дискретное логарифмирование по такой аналогии.

Оно всё равно считается в вещественных числах. Надо будет округлять - сам сделаешь. А целочисленное деление делается целочисленно.

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

В посте выше неплохо описано.
Так оставили, видимо, по аналогии с поведением операторов в С.

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

>>Ты реально не отличаешь функцию от оператора?

В контексте аналитической записи функционального отношения? Нет, конечно, ведь я не идиот.

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

Функции нет такой, ибо мало кому надо. А если бы и была - называлась бы по-другому. Потому что для функции с данным именем строго заданы количество и тип аргументов, а также тип возвращаемого значения. В этом и есть её отличие от оператора.

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

>Си тоже также работает.

Только при чем тут Си?

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

> Логарифм как функция из int в int лишён всякого смысла

Не совсем. Операция логарифмирования в конечных полях вполне себе осмыслена, более того, она используется (точнее, проблема ее вычисления) используется в алгоритмах шифрования с открытым ключом

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

>>Функции нет такой, ибо мало кому надо.

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

mclaudt
() автор топика
Ответ на: комментарий от melkor217

>>Функции нет такой, ибо мало кому надо. А если бы и была - называлась бы по-другому. Потому что для функции с данным именем строго заданы количество и тип аргументов, а также тип возвращаемого значения. В этом и есть её отличие от оператора.

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

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

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

Что сказать-то хотел? Шли фичреквест разрабам. Вон в динамическом питоне по просьбам трудящихся / стал обозначать только вещественное деление, а // только целочисленное, так как приходится писать 1.0*x/y или float(x)/y.

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

А что, «man log» отменили?

ИМЯ

exp, log, log10, pow - вычисление экспоненты, логарифма и возведение в степень

СИНТАКСИС

#include <math.h>

double exp(double x);

double log(double x);

То есть x, какой бы он ни был, сначала приводится в double, а потом уже логарифмируется.

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

Ну и ради чего ты нам это поведал? О том и речь, что он конвертирует аргументы во флоат, и именно это вызывает некую логическую несостыковку с поведением _функции_ /, которая такую конвертацию не выполняет.

inb4: «/ - оператор»

ответ: это не устраняет логической несостыковки, скелет языка не должен анорексично выпирать через кожу.

mclaudt
() автор топика
Ответ на: комментарий от oami

>>В R 1/3=0.3333333. И графики он тоже строит, да.

Вот это дела! А как же «деление в Си»?!!! А может, все-таки дело не в Си, а в том что у разработчиков R голова из плеч растет?

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

Просто разработчики R понимают, что их продуктом пользуются и экономисты, и экологи, и многие другие, для которых 1/3 не равна нулю. Но я все равно пишу 1.0/3.0, даже в R :)

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

>>их продуктом пользуются и экономисты, и экологи

Да для этих можно было и не напрягаться - на самом деле суть не в том чтобы операция 1/3 была вещественной (можно и привыкнуть явно указывать тип), а чтобы везде была одинаковая логика (коль скоро сохраняем int в выводе, то сохраняем во всех допускающих это функциях), котрая увы, в гнуплоте не наблюдается.

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