тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
В математике запись башни степеней a^b^c общепринято означает, что возведение в степень производится справа налево, т.е., a^(b^c)
В некоторых языках программирования для возведения в степень отведена не функция типа pow(x,y), а отдельный оператор, напр., x^y или x**y (в Си, паскале и джаве, например, такого оператора нет)
И как же в таких языках производится вычисление выражения типа a^b^c ?
Мне было не лень, я потыкал в несколько языков на ideone, посмотрел что там получается:

читать дальше

конечно, я перепробовал не все языки, можно нарыть ещё примеры, и прошу вас дополнить этот список
жутко интересно, существуют ли ещё "неправильные" языки, кроме микрософторождённых?

@темы: Вопрос, степень

Комментарии
03.09.2014 в 09:31

Миру - мир. А Вам - пломбир!
В некоторых языках 2**3 приведёт к синтаксической ошибке, а 2^3 выдаст 1 ибо означает XOR. Для степени же есть функции. Я бы назвал такой подход более корректным (: Ну и парсить интерпретатору/компилятору проще.

Добавлю из того, что нашёл у себя на машине.

## Syntax error
C++11
PHP (5.5-)
Js/Node
Erlang
Forth
Pascal
MySQL

## К правильным в копилку
bash:
$ echo $((2**3**2)) # 512

php (5.6+):
$ php -r "echo 2**3**2;" # 512

Forth (:

: ** ( a b -- a**b )
1 SWAP ?DUP IF 0 DO OVER * LOOP THEN NIP ;
2 3 2 ** ** . \ 512


## К неправильным в копилку
Внезапно, MathLab:
2**3**2 % 64

Basic:
PRINT 2**3**2 REM 64


А вообще, есть же статья на rosettacode про этот оператор на 68 различных ЯП.
03.09.2014 в 15:24

На свете есть всего 10 разновидностей людей. Те, которые понимают бинарный код, и те, кто не понимают
Правильно
Maxima:
2^3^2;

Больше ничего из не рассмотренного выше на этой машине у меня нет(
03.09.2014 в 15:31

тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
Скептичный циник,
возможно, я не очень понятно написал, но речь шла про оператор возведения в степень, как бы он ни обозначался в языке,
а не про операторы, обозначаемые символами ^ и **
так что ваш список ## Syntax error - мимо кассы

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

статья по вашей ссылке объясняет, как реализовать функцию pow даже в тех языках, где есть оператор возведения в степень.
прикольно, но не в тему

версию бейсика не уточните?

а вот за bash, пих-пих-пих и матлаб - спасибо!
03.09.2014 в 15:40

тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
alba-longa, спасибо за Maxima
04.09.2014 в 03:15

Миру - мир. А Вам - пломбир!
> оператор возведения в степень, как бы он ни обозначался в языке, а не про операторы, обозначаемые символами ^ и **
А что, из списка "syntax error" хоть у одного языка есть такой оператор (как бы он ни обозначался)?
Я написал этот список затем, чтобы сузить поиск. Очевидно, что в них нужно использовать pow или самосборный глагол (как в примере с Forth) так как в некоторых из них нет вообще понятия "оператор".
Но это уже философия.

> версию бейсика не уточните?
Несколько, результаты сильно отличаются.

FreeBasic (0.91):
10 PRINT 2**3**2 REM SyntaxError: Unexpected token '*'

10 PRINT 2^3^2 REM 64


QBasic:
PRINT 2**3**2 REM Syntax error

PRINT 2^3^2 REM Bad token


KBasic:
PRINT 2**3**2 REM 12 (0.o) WUT?!

PRINT 2^3^2 REM 64


YaBasic (2.9):
PRINT 2**3**2 REM 64

PRINT 2^3^2 REM 64


Интересно было бы посмотреть на другие компиляторы и версии Паскаля (у меня FreePascal 2.6).
А так же глянуть на Delphi и Fortran (:
04.09.2014 в 04:59

тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
Скептичный циник, я уже и не знаю, какими словами сказать...
интересуют только языки, в которых ЕСТЬ арифметический оператор возведения в степень (а именно, интересует его лево- или право-ассоциативность)
другие языки не интересуют. совсем.
зачем смотреть дельфи, если в паскале такого оператора нет?

вопрос "а что скажет компилятор, если мы напишем две звёздочки подряд?", хотя и может быть интересен, но к этой теме не относится.
дельфи 7 сказал вот что:
b := 2^3; [Error] Main.pas(358): Pointer type required
b := 2**3; [Error] Main.pas(359): Expression expected but '*' found
потому что в паскале сишный xor означает получение содержимого памяти по типизированному указателю

с бейсиком интересно - что стандарт языка говорит про степень?
разные диалекты используют разные обозначения, некоторые даже глотают две звёздочки как обычное умножение (там, где результат 12)
помню, в бейсике на БК0010-01 для степени использовался символ, которого нет в ASCII-кодах (горизонтальная линия с засечкой вниз под буквой Ч, i.imgur.com/HyVQiHa.jpg )
04.09.2014 в 06:44

Миру - мир. А Вам - пломбир!
> зачем смотреть дельфи, если в паскале такого оператора нет?
Затем, что тот же Standart от Turbo/Object уже отличается значительно, емнип. Интересна скорее линейка XE, а не VB6.

> вопрос "а что скажет компилятор, если мы напишем две звёздочки подряд?", хотя и может быть интересен, но к этой теме не относится.
Отчего же? Задам вопрос иначе. Какие символьные представления операторов (кроме ** и ^) существуют для обозначения экспоненты в ЯП? Я знаю только два:
1. Какой-то хрен-найдёшь-клавишу-знак у APL (но так можно сказать про почти все символы языка)
2. F# с глаголом pown, который отличается от Forth тем, что заранее забит в BCL (поставляемой сразу с .NET).

Вспомнив F# не поленился и сходил в он-лайн компилятор D за правильным ответом:
writeln(2^^3^^2); // 512


Можно было бы ещё в такие языки посмотреть как J, K, R, Haskell.

> что стандарт языка говорит про степень?
Стандартов Васика с десяток, а реализаций ещё больше на каждый стандарт. Причём, разница между ними, простите за тавтологию, очень разная.
В первом стандарте операторов вообще немного и экспоненты среди них не было. До реализаций примерно конца 80х считали руками в цикле или с помощью функции EXP(), но даже она не везде существовала.

Про спецкнопку интересно, спасибо. При её нажатии что было видно на дисплее?
04.09.2014 в 07:01

тролль - это не только ценный жир, но и 3-4 легкоусвояемых коммента ежедневно
При её нажатии что было видно на дисплее?
вот такая же загогулина и печаталась )