Чому Math.pow (0, 0) === 1?


85

Ми всі знаємо, що 0 0 є невизначеним.

Але , javascript говорить, що:

Math.pow(0, 0) === 1 // true

і C ++ говорить те саме:

pow(0, 0) == 1 // true

ЧОМУ?

Я це знаю:

>Math.pow(0.001, 0.001)
0.9931160484209338

Але чому Math.pow(0, 0)помилок не виникає? Або, можливо NaN, буде краще, ніж 1.


3
@zzzzBov: За стандартним визначенням, "a <sup> b </sup> = exp (b ln (a))", це не визначено. Спроба визначити це як "limit <sub> x-> 0 </sub> f (x) <sup> g (x) </sup>", де "f" і "g" мають межі нуля, дає невизначену значення, оскільки це залежить від вашого вибору функцій. (Вибачення за спотворену нотацію; я не можу зрозуміти, як отримати верхній індекс у коментарях).
Майк Сеймур

@MikeSeymour, так, я усвідомлюю, що 0⁰ (використовувати символи Unicode) є невизначеним з огляду на це визначення, однак, якщо ви прочитаєте мій коментар, ви повинні зауважити, що цитата посилається на "світ математики", а не на будь-яке "стандартне визначення". Саме на цю різницю я посилався спочатку, і питання було оновлено, щоб виправити цей нюанс.
zzzzBov

2
@AJMansfield Гм ... a ^ 0 = 1 для ненульового a.
Беска

Це дозволяє функціям, які залежать від добутків ймовірностей, дати розумні результати. Невірно вважати, що комп’ютери є символічними математичними процесорами. Мова С має конкретну реалізацію в реальному світі, тоді як ваш математичний світ може бути занадто ідеальним, щоб бути доповненим кремнієм.
IRTFM

26
Для математичної версії цього питання - "чому ми часто визначаємо 0 ^ 0 = 1?" - math.stackexchange має багато хороших відповідей: math.stackexchange.com/questions/11150/…
PLL

Відповіді:


78

У C ++ в результаті потужно (0, 0) результат в основному визначається реалізація поведінки , оскільки математично ми маємо суперечливу ситуацію , в якій N^0завжди має бути , 1але 0^Nзавжди має бути 0на N > 0, так що ви не повинні мати ніяких очікувань математично в результаті цього або. У цьому повідомленні на форумі Wolfram Alpha йдеться трохи більше деталей.

Наявність pow(0,0)результату в 1корисно для багатьох додатків, оскільки обгрунтування міжнародного стандарту - Мови програмування - C говорить у розділі, що охоплює підтримку арифметики з плаваючою крапкою IEC 60559 :

Як правило, C99 уникає результату NaN, коли числове значення є корисним. [...] Результати pow (∞, 0) та pow (0,0) дорівнюють 1, оскільки існують програми, які можуть використовувати це визначення. Наприклад, якщо x (p) та y (p) - це будь-які аналітичні функції, які стають нулем при p = a, тоді pow (x, y), що дорівнює exp (y * log (x)), наближається до 1 із наближенням p a.

Оновіть C ++

Як leemes правильно вказав , що я спочатку пов'язано з посиланням на комплексну версію потужна в той час як нескладна версію стверджує , що це помилка домену проекту стандарту C ++ повертається до проекту стандарту C і як С99 і С11 в розділі 7.12.7.4 військовополонених функції пункт 2 говорить ( наголос на моєму ):

[...] Помилка домену може статися, якщо x дорівнює нулю, а y дорівнює нулю. [...]

що, наскільки я можу зрозуміти, означає, що ця поведінка є невизначеною поведінкою Перемотування бітового розділу 7.12.1 Обробка умов помилок говорить:

[...] помилка домену виникає, якщо вхідний аргумент знаходиться поза доменом, над яким визначена математична функція. [...] При помилці домену функція повертає значення, визначене реалізацією; якщо цілочисловий вираз math_errhandling & MATH_ERRNO ненульовий, цілочисловий вираз errno набуває значення EDOM; [...]

Отже, якщо була помилка домену, то це була б поведінка, визначена реалізацією, але як в останніх версіях, так gccі clangв значенні errnois, 0це не є помилкою домену для цих компіляторів.

Оновіть Javascript

Для Javascript Специфікації ECMAScript® Мови в розділі 15.8 Математики Об'єкт під 15.8.2.13 потужному (х, у) говорить , що серед інших умов , що:

Якщо y дорівнює +0, результат дорівнює 1, навіть якщо x дорівнює NaN.


1
@leemes Я вважаю, що сторінка неправильна, стандарт не говорить, що NaN слід повертати. Повернене значення визначається реалізацією. cplusplus.com, який, на вашу думку, не є надійним джерелом, насправді тут є більш точним.
інтермедія

@interjay Думаю, ви маєте на увазі видалену відповідь; Я цитував лише його ненадійність, сподіваючись, що це може пояснити голос проти (що не мною). Ну, обидві сторінки - це вікі, тому їх надійність залежить від їхніх редакторів, які є людьми і роблять помилки. ;)
leemes


@ShafikYaghmour Я поставив те саме запитання (у видаленій відповіді).
leemes

1
@Alek Я ціную відгуки, я намагаюся написати відповіді, які я хотів би прочитати від інших. Мені не завжди вдається, але я намагаюся. Писати хороші запитання ще складніше, я лише один раз намагався це зробити, і я витратив на це довше, аніж на свої відповіді.
Шафік Ягмор

35

У JavaScript Math.powвизначається наступним чином :

  • Якщо y - NaN, результат - NaN.
  • Якщо y дорівнює +0, результат дорівнює 1, навіть якщо x дорівнює NaN.
  • Якщо y дорівнює −0, результат дорівнює 1, навіть якщо x дорівнює NaN.
  • Якщо x NaN, а y ненульовий, результат NaN.
  • Якщо abs (x)> 1 і y дорівнює + ∞, результат дорівнює + ∞.
  • Якщо abs (x)> 1 і y дорівнює −∞, результат дорівнює +0.
  • Якщо abs (x) == 1 і y дорівнює + ∞, результатом є NaN.
  • Якщо abs (x) == 1 і y дорівнює −∞, результатом є NaN.
  • Якщо abs (x) <1 і y дорівнює + ∞, результат дорівнює +0.
  • Якщо abs (x) <1 і y дорівнює −∞, результат дорівнює + ∞.
  • Якщо x дорівнює + ∞ і y> 0, результат буде + ∞.
  • Якщо x дорівнює + ∞ і y <0, результат дорівнює +0.
  • Якщо x дорівнює −∞ і y> 0, а y - непарне ціле число, результат дорівнює −∞.
  • Якщо x дорівнює −∞ і y> 0, а y не є непарним цілим числом, результат буде + ∞.
  • Якщо x дорівнює −∞ і y <0, а y - непарне ціле число, результат дорівнює −0.
  • Якщо x дорівнює −∞ і y <0, а y не є непарним цілим числом, результат дорівнює +0.
  • Якщо x дорівнює +0 та y> 0, результат дорівнює +0.
  • Якщо x дорівнює +0 і y <0, результат дорівнює + ∞.
  • Якщо x дорівнює −0 та y> 0, а y - непарне ціле число, результат дорівнює −0.
  • Якщо x дорівнює −0 і y> 0, а y не є непарним цілим числом, результат дорівнює +0.
  • Якщо x дорівнює −0 та y <0, а y - непарне ціле число, результат дорівнює −∞.
  • Якщо x дорівнює −0 і y <0, а y не є непарним цілим числом, результат дорівнює + ∞.
  • Якщо x <0 і x скінченне, а y скінченне, а y не ціле число, результатом є NaN.

наголос мій

як правило, рідні функції будь-якої мови повинні працювати, як описано в специфікації мови. Іноді це включає явно "невизначену поведінку", де реалізатор повинен визначити, яким має бути результат, проте це не випадок невизначеної поведінки.


Додаток F у стандартах C99 та C11 містить цю саму специфікацію. Реалізація повинна визначатись, __STDC_IEC_559__щоб оголосити, що вона відповідає цій специфікації. Додаток F описує IEC 60559 арифметику з плаваючою точкою. Я вважаю, що специфікація C може частково відповідати Додатку F (наприклад, pow (0, 0) == 1), а не визначати __STDC_IEC_559__.
Говард Хіннант,

@HowardHinnant hmmm, здається, що у випадку gcc і clang ця інформація може бути не зовсім корисною, що знеохочує.
Шафік Ягмор

6
Не знаю, що ця відповідь допомагає. Звичайно, функція повинна виконувати так, як це визначено в специфікації. Але тоді питання просто стає "Чому це було визначено таким чином у специфікації?"
Беска

Добре, що це (напевно) робиться в апаратному забезпеченні, інакше це буде нуклеотидною продуктивністю з усіма цими особливими випадками :)
Томас

16

Це просто умовність визначити його як 1, 0або залишити його undefined. Визначення порошок (0,0)широко поширене через таке визначення:

визначення математичної потужності


Документація ECMA-Script говорить про pow(x,y):

  • Якщо y дорівнює +0, результат дорівнює 1, навіть якщо x дорівнює NaN.
  • Якщо y дорівнює −0, результат дорівнює 1, навіть якщо x дорівнює NaN.

[ http://www.ecma-international.org/ecma-262/5.1/#sec-15.8.2.13 ]


3
math.stackexchange має багато хороших обговорень та пояснень щодо визначення 0 ^ 0 = 1: math.stackexchange.com/questions/11150/…
PLL

14

За даними Вікіпедії:

У більшості параметрів, що не передбачають неперервності експоненти, інтерпретація 0 0 як 1 спрощує формули та позбавляє потреби в особливих випадках у теоремах.

Існує кілька можливих способів поводження 0**0з плюсами і мінусами кожного (див. Вікіпедію для розширеного обговорення).

Стандарт IEEE 754-2008 з плаваючою комою рекомендує три різні функції:

  • powтрактує 0**0як 1. Це найстаріша визначена версія. Якщо потужність є цілим цілим числом, результат такий самий, як і для pown, в іншому випадку результат є таким, як для powr(за винятком деяких виняткових випадків).
  • pownрозглядає 0 ** 0 як 1. Потужність повинна бути точним цілим числом. Значення визначено для від’ємних основ; наприклад, pown(−3,5)є −243.
  • powrрозглядає 0 ** 0 як NaN (Not-a-Number - undefined). Значення також NaN для таких випадків, як, powr(−3,2)коли база менше нуля. Значення визначається exp (потужність '× журнал (база)).

6

Дональд Кнут

начебто вирішили цю дискусію в 1992 році наступним:

введіть тут опис зображення

І ще детальніше вдався до своєї статті « Дві нотатки про нотацію» .

В основному, хоча ми не маємо 1 як обмеження f(x)/g(x)для всіх не всіх функцій, f(x)і g(x)це все одно робить комбінаторику набагато простішою для визначення 0^0=1, а потім просто робимо особливі випадки в тих кількох місцях, де вам потрібно розглянути такі функції, як 0^x, які дивні в будь-якому випадку. Адже x^0придумується набагато частіше.

Одні з найкращих дискусій, які я знаю з цієї теми (крім статті Кнута):


Якщо ви ще не читали, читайте відповіді в нулі до нульової потужності ...? який був пов’язаний із питанням, на яке деякі відповіді також охоплюють цей підхід.
Шафік Ягмур

5

Коли ви хочете знати, якому значенню ви повинні надати, f(a)коли fбезпосередньо не обчислюється a, ви обчислюєте межу часу, fколи xпрагне до a.

У випадку x^y, звичайні межі мають тенденцію до того, 1коли xі yяк правило 0, і особливо, x^xяк правило, 1коли це xпрагне 0.

Див. Http://www.math.hmc.edu/funfacts/ffiles/10005.3-5.shtml


5

Визначення мови С говорить (7.12.7.4/2):

Помилка домену може статися, якщо x дорівнює нулю, а y дорівнює нулю.

Там також сказано (7.12.1 / 2):

У разі помилки домену функція повертає значення, визначене реалізацією; якщо цілочисловий вираз math_errhandling & MATH_ERRNO ненульовий, цілочисловий вираз errno набуває значення EDOM; якщо цілочисловий вираз math_errhandling & MATH_ERREXCEPT ненульовий, піднімається виняток з плаваючою комою '' недійсним ''.

За замовчуванням значення math_errhandlingє MATH_ERRNO, тому перевірте errnoзначення EDOM.


1
Батоги! Це справді цікаво! Я скомпілював свій файл cpp за допомогоюg++ (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.
Ionică Bizău

0

Я хотів би не погодитись із твердженням деяких попередніх відповідей, що це питання домовленостей чи зручності (що охоплює деякі особливі випадки для різних теорем тощо), що 0 ^ 0 визначається як 1 замість 0.

Посилення насправді не так добре поєднується з іншими нашими математичними позначеннями, тому визначення, яке ми всі вивчаємо, залишає місце для плутанини. Дещо інший спосіб наблизитись до нього полягає у тому, що a ^ b (або exp (a, b), якщо хочете) повертає значення мультиплікативно, еквівалентне множенню якоїсь іншої речі на a, повторене b разів.

Помноживши 5 на 4, 2 рази, отримаємо 80. Ми помножили 5 на 16. Отже, 4 ^ 2 = 16.

Коли ви помножуєте 14 на 0, 0 рази, у нас залишається 14. Ми помножили його на 1. Отже, 0 ^ 0 = 1.

Цей напрямок мислення також може допомогти прояснити негативні та дробові показники. 4 ^ (- 2) - це 16-е число, оскільки 'від'ємне множення' - це ділення - ми ділимо на чотири рази двічі.

a ^ (1/2) - це корінь (a), оскільки множення чогось на корінь a - це половина мультиплікативної роботи, як множення його на самого себе - вам доведеться зробити це двічі, щоб помножити щось на 4 = 4 ^ 1 = (4 ^ (1/2)) ^ 2


0

Щоб це зрозуміти, потрібно вирішити числення:

введіть тут опис зображення

Розширивши x^xнавколо нуля за допомогою серії Тейлора, отримаємо:

введіть тут опис зображення

Отже, щоб зрозуміти, що відбувається з обмеженням, коли xдорівнює нулю, нам потрібно з’ясувати, що відбувається з другим членом x log(x), оскільки інші терміни пропорційні x log(x)підвищенню до певної міри.

Нам потрібно використовувати трансформацію:

введіть тут опис зображення

Тепер після цієї трансформації ми можемо скористатися правилом L'Hôpital , яке говорить:

введіть тут опис зображення

Отже, диференціюючи цю трансформацію, ми отримуємо:

введіть тут опис зображення

Отже, ми підрахували, що доданок log(x)*xдоходить до 0, коли x наближається до 0. Легко помітити, що інші послідовні доданки також наближаються до нуля і навіть швидше, ніж другий доданок.

Отже, в даний момент x=0ряд стає 1 + 0 + 0 + 0 + ...і, таким чином, дорівнює 1.


Хоча ця відповідь вражає, варто зазначити, що в математиці межа, як x-> a f (x), не обов'язково дорівнює f (a), якщо функція не є безперервною при x.
jasonszhao
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.