Kompyuter nolga bo'linishga urinib ko'rmaydimi?

Biz hammamiz bilamizki 0/0 - bu Undefined va , bir kalkulyator joylashtirish uchun bir xato qaytaradi va bir dastur (kamida C) operatsion tizim nolga tenglashishga harakat qilganda to'xtatadi.

Biroq, kompyuterim hatto nolga bo'linishga urinmoqchi bo'lsa ham, yoki faqatgina «himoyalangan joyga» egalik qilgan bo'lsa, shuni bilishim mumkinki, 0/0 xato hisoblashdan oldin ham xato qaytaradi?

59
@Muhd - o'z-o'zidan bo'linadigan narsa 1-dir. Biroq, nolga bo'linadigan narsa aniqlanmagan. Shuning uchun, 1 = 0/0 = undefined, shu sababli 1 aniqlanmagan va matematikalar faqat tikuvlardan tushib ketgan. Dunyoning oxiri uchun tayyorlaning .... (Va, BTW - yo'q , GMT GMT emas edi, Sharqiy standart edi - agar Xudoning so'zi bo'lsa ... :-)
qo'shib qo'ydi muallif Matthew, manba
x har qanday nol bo'lmagan holda, x/0 aniqlanmagan. 0/0 aniqlanmagan. Bu aniqlanmaganidan yomonroq. Bu aniq emas.
qo'shib qo'ydi muallif Ben, manba
"Juda kengmi?" Albatta? Bizda IEEE spektri va ikkita juda mashhur arxitekturasi (AMD64 va ARM) bor. Chillanish kerak.
qo'shib qo'ydi muallif user22815, manba
@jwg 0/0 = 0 men uchun mantiqan to'g'ri keladi. Masalan, 0/0 muvaffaqiyatli urinishlar => 0% muvaffaqiyat darajasi va 0% muvaffaqiyatsizlik darajasi. 0/x endi x = 0 uchun istisnoga kerak bo'lmaydi.
qo'shib qo'ydi muallif NKY Homesteading, manba
Matematik jihatdan x/0 har birining (hech bo'lmaganda haqiqiy) x
qo'shib qo'ydi muallif Sheryl S., manba
@jwg: "Agar u qiymatga ega bo'lsa 1 bo'lishi kerak" - shart emas; qiymat turli vaziyatlarda bo'lishi mumkin bo'lgan bag'ishlangan butun matematika shoxlari mavjud :)
qo'shib qo'ydi muallif Ben Baril, manba
0/0 belgilanmagan bo'lsa-da, lekin u qiymatga ega bo'lsa, u 1 bo'lishi kerak. 0 ga bo'linadigan boshqa raqamlar aniqlanmagan bo'lsa-da, agar bizda mavjud bo'lgan javoblarda abadiylik mavjud bo'lsa, u abadiy bo'ladi.
qo'shib qo'ydi muallif jwg, manba
@ Menimcha, siz chegaralar haqida gapirmoqdasiz. 0/0 aniqlanmagan. Ikkala numerator va denominator ham 0 ga mos tushadigan faktor chegarasi, ba'zi bir tarzda hisob-kitob qilinadigan ba'zi bir qiymatga (balki 1 yoki hatto cheklangan emas) muvofiq bo'lishi mumkin. Ammo 0 raqamiga bo'linadigan 0 raqami aniqlanmagan. f (x) x x dan farq qiladigan 0 * x = 0 ning cheksizligiga kiruvchi x uchun chegara qiymatlari xuddi shu tarzda,/code> qaerda f (x) kodi 0 bilan x bilan abadiylikka boradi: bu noaniq shakl bo'lishi mumkin.
qo'shib qo'ydi muallif Tobias Sette, manba
Ljuppitalning qoidani bilan qiziqishingiz mumkin. 0/0 qiymatining 1 qiymatini nazarda tutmagan holatlar aniq.
qo'shib qo'ydi muallif guaka, manba
Bu erda terminni aniqlashtirish uchun 0/0 ni aniqlanmagan shaklda deb atashadi, x/0 esa nol bo'lmagan x uchun aniqlanmagan hisoblanadi. 0/0 bilan yakunlanadigan hisob-kitobni tez-tez aniq javob berish uchun boshqacha tarzda hisoblash mumkin, x/0 aslida ma'nosizdir.
qo'shib qo'ydi muallif GentleEarwig, manba
0/0 belgilanmagan bo'lsa, boshqa raqamlar/0 boshqa turdagi xatodir, ikkinchisiga shubhali tuyuladi
qo'shib qo'ydi muallif omer, manba
Bu menga Feynman hikoyasini eslatadi, u erda elektro-mexanik kalkulyatorlar haqida gapiradi. Agar tasodifan biror narsani nolga tenglashtirsangiz, hisoblashni bajaradigan rotor faqat o'ngga aylanadi va aylanadi va aylanadi, shuning uchun bu mashinalarda qizil "bekor" tugmachalari mavjud.
qo'shib qo'ydi muallif GhostChild, manba
0 ga bo'linadigan har qanday raqam matematik tarzda so'zsiz.
qo'shib qo'ydi muallif ManoDestra, manba

5 javoblar

CPU aniqlanishni o'rnatdi. Aksariyat buyruqlar majmui arxitekturasi CPU nolga ajratish uchun istisno ishlovchilariga tuzatishni bildiradi (agar dividendlar nol bo'lsa, bu g'amxo'rlik qilmaydi deb o'ylamayman).

Nolinchi divizor uchun chegara apparatdagi parallel ravishda bo'linishi mumkin, lekin bo'linishni amalga oshirishga urinish bilan shug'ullanish mumkin, biroq bu buzg'unchi vaziyatni aniqlab olish uning bo'linishini va tuzoqlarini samarali tarzda bekor qiladi, shuning uchun biz ba'zi bir qismlarni Ulardan biri bo'linishga urinib ko'rdi.

(Uskuna ko'pincha parallel ravishda bir nechta ishlarni bajarib, undan so'ng tegishli natijani tanlab oladi, chunki har bir operatsiyani bajarish jarayoni tegishli operatsiyani tanlash uchun ketma-ket ishga tushirish o'rniga darhol boshlanishi mumkin.)

Tashqari mexanizmiga o'xshash tuzoqqa shuningdek, turli xil qo'shimcha/sub/mul yo'riqnomalari (yoki ko'rsatmalarda bayroq) yordamida odatiy ravishda so'rab olgan toshqinlar aniqlanganda ishlatiladi.

O'zgaruvchan nuqta bo'linishi, shuningdek, nolga ajratish uchun aniqlashda ham qurilgan, biroq boshqa qiymatni qaytaradi ( IEEE 754 NaN ) maxsus vaziyatni ishlovchilarga qamash o'rniga belgilaydi.


Hipotetik nuqtai nazardan, agar protsessor nolga tenglashishga urinish uchun biron bir farqni topmasa, muammolarni quyidagilar bo'lishi mumkin:

  • hanging the CPU (e.g. in an inf. loop) — this might happen if the CPU uses an algorithm to divide that stops when the numerator is less than the divisor (in absolute value).  A hang like this would pretty much count as crashing the CPU.
  • a (possibly predictable) garbage answer, if the CPU uses a counter to terminate division at the maximum possible number of divide steps (e.g. 31 or 32 on a 32-bit machine).
74
qo'shib qo'ydi
Agar CPU qurilmani nolga tenglashtirmasa, nima yuz berishi mumkinligini bilib oling. : OK. Bo'linish ishi, asosan, "uzoq bo'linish" deb o'rgandingiz, garchi ikkilikda osonroq bo'lsa. Buni amalga oshirish uchun kodni yozing, bit operatsiyalari va looplardan foydalaning (eski CPUlar bilan tuzilgani yo'q kabi). Haqiqiy apparatni amalga oshirishni ko'p sonli iteratsiyalarga ega bo'lishini kutmoqdaman, shuning uchun uni osmaydi. Bu ba'zi javobini ishlab chiqaradi. Qabul qilingan narsalarni ko'rish uchun qog'ozga harakat qilib ko'ring. To'liq tafsilotlar aniq mantiqqa va filial tartibiga bog'liq.
qo'shib qo'ydi muallif Gilles, manba
@ Barchasi ha, lekin abadiy aylanishiga moyil bo'lgan versiya amaliyotda juda ko'p ishlatish uchun juda samarasiz bo'lishi mumkin. Odatda foydalaniladigan i odatdagidan farqli ravishda, ular -1 (yoki maxint) ning bir qismini va asl dividendga o'xshash qolgan qismni berishi kabi ko'rinadi.
qo'shib qo'ydi muallif Krzysztof Klimonda, manba
@Ankush Bir nechta holatlar CPU darajasidagi "tizimning qulashi" ga olib keladi. Bunday hollarda biz termal muhofaza qilishni to'xtatib turish (qizib ketishdan himoya qilish), masalan, uchta xato »va o'xshash vaziyatlar. yaroqsiz opcodes , shu jumladan odatiy foydalanishda duch keladigan har bir falokat, trapping and recovery ba'zi bir usullarda, yoki xatolarni e'tiborsiz qoldirib, potentsial nopok davlatda bajarilishini davom ettirishi mumkin.
qo'shib qo'ydi muallif Pacane, manba
Suzuvchi nuqta uchun, "NaN" va "tuzoq" o'rtasidagi tanlov odatda FPU-da bayroqlarni almashtirish yo'li bilan o'rnatiladi.
qo'shib qo'ydi muallif Dissenter, manba
@CortAmmon: Nolga chidab bo'lmaydigan bo'linma "aniqlanmagan xatti-harakat" bu tilning spetsifikatsiyasiga bog'liq bo'lishi mumkinmi? Agar til to'liq ifodalangan bo'lsa, x, x/0 ning har qanday aniqligi x ni beradi; ishlash xarajatlari odatda nisbatan arzon bo'lishi mumkin va ba'zi algoritmlarni imkon qadar qulay tarzda yozilishi mumkin.
qo'shib qo'ydi muallif supercat, manba
Splitting-by-zero tuzilmaydigan protsessorlarga mo'ljallangan ko'p tillar oddiygina bo'linishi nolga teng bo'lib, qiymatni beradi. Ba'zi apparat dizayni mavjud bo'lsa, trapping divide-by-nolor qiymati oddiygina qiymat hosil qilgandan ko'ra oson bo'lishi mumkin (masalan, hech bo'lmaganda nol-tuzuvchi apparat mavjud emas, lekin agar bir buyruq juda uzoq davom etsa amalga oshirish) Men bunday tuzoqqa juda ko'p maqsadni ko'rmayapman.
qo'shib qo'ydi muallif supercat, manba
@Ankush "Tizimning qulashi" aslida CPU darajasida bo'ladigan narsa emas. Nolga tenglashtirilmagan CPU ning xatti-harakatlari shundan iboratki, bu bo'linish jarayoni oddiygina bo'lib, bir noxush natija hosil qiladi va davom etadi. Tarkibiga duch keladigan ikkita tamsayı qo'shgandek.
qo'shib qo'ydi muallif Ixrec, manba
O'zgaruvchan nuqtali raqamlar uchun, aslida, faqat 0/0 (yoki NaN/0) NaN, x/0 esa boshqa x uchun ijobiy yoki salbiy abadiylikni beradi.
qo'shib qo'ydi muallif Paŭlo Ebermann, manba
@Ankush Agar lxrec nima degani aniq bo'lmasa: protsessor haqida gap ketganda, bunday falokat kabi narsa yo'q.
qo'shib qo'ydi muallif immibis, manba
@CortAmmon Barcha raqamli operator operator kodi x/0 ni bir xil belgining (masalan, INT_MIN or INT_MAX ) eng katta tamsayı sifatida belgilaydigan C dialekti mavjud >) kelajakda istiqbolli proektsion ishlarni bajarish. Men bu tilda o'yinni ishlab chiqdim.
qo'shib qo'ydi muallif telesphore4, manba
Juda chuqurroq javob uchun minnatdorman :) Men faqat CPU qurilmani nolga tenglashtirmasa nima sodir bo'lishiga qandaydir nurni to'kib yuborgan-qilmaysizmi deb hayron bo'ldim - asosan qanday muammolarga duch kelasiz? CPU uni faqat e'tiborsiz qoldiradimi, yoki tizimning buzilishi kabi jiddiyroq narsa bormi? rahmat :)
qo'shib qo'ydi muallif dan3, manba
@supercat Ha, til uni aniqlab berishi mumkin. Til siz xohlagan narsani qila oladi. Biroq, bu xatti-harakatni amalga oshiradigan yagona tilni nomlay olasizmi? O'Rning savoliga javob beradigan bo'lsak, men nolga bo'lingan tillarning nazariy imkoniyatlarini o'rganishni his qildim, ayniqsa, "qurilgan himoyalangan" va "kod <0> 0 " kabi so'zlar bilan tartibsizlikni keltirib chiqaradi. savollaringiz uchun nazariy narsalar ;-)
qo'shib qo'ydi muallif Cort Ammon, manba
Agar siz nolga bo'linib ketmasangiz, natija, dasturiy nuqtai nazardan, "aniqlanmagan xatti-harakat" bo'ladi. Bu shuni anglatadiki, kompyuter hamma narsaga qodir. Ehtimol, Bergi eslatib turganday, buggy loopiga kirib, osib qo'yishi mumkin. Bu faqat bo'linish mantig'ini amalga oshirishda yuzaga kelgan ba'zi bir aniqlanmagan qatorlarni chiqarishi mumkin (esda tutingki, kompyuter matematik ma'noda "bo'linmaydi"), bu ikki bo'lakka bo'linadi, Odatda biz uni "bo'linish" deb ataymiz. Shuningdek, suzuvchi nuqta aylanishini ham ko'ring).
qo'shib qo'ydi muallif Cort Ammon, manba
@Ixrec: Yaxshi o'ylayman, yomon ishlaydigan (yoki buggy) protsessor 0 ga bo'linib, cheksiz mikrokod loopi bilan muzlatib qo'yishi mumkin, deb o'ylayman.
qo'shib qo'ydi muallif Bergi, manba

Bu tamsayılar yoki suzuvchi nuqtali raqamlardan foydalanganingiz yoki yo'qligini bilishingizga bog'liq.

Suzuvchi nuqta raqami uchun ko'pgina ilovalar IEEE 754 standartidan foydalanadi, bu erda 0 bo'limi aniq belgilangan. 0/0 aniqlangan natijalarni NaN (no-a-raqam) va x ≠ 0 uchun x/0 x belgisiga qarab + yoki Infinity yoki -Infinity ni beradi.

C, C ++ va hokazo kabi tillarda nol deb atalmish undefined behavior. Shunday qilib, til ta'rifi bo'yicha narsa bo'lishi mumkin. Ayniqsa, siz istamagan narsalar. Kodni yozganda va mijozlar foydalangan paytda ma'lumotlarni yo'qotishda hamma yaxshi ishlaydi. Shuning uchun til nuqtai nazaridan buni qilmang . Ba'zi tillardagi kafolati ilovangizning qulashi; bu ularga qanday amalga oshirilayotgani haqida. Ushbu tillar uchun nolga bo'linish halokatga olib keladi.

Ko'pgina protsessorlar protsessorga bog'liq ravishda turli xil turdagi "divide" ko'rsatmalariga ega. Intel 32bit va 64 bitli protsessorlarda "bo'linish" ko'rsatmalari nolga bo'lishga harakat qilayotganingizda ilovangizni buzadi. Boshqa protsessorlar boshqacha harakat qilishlari mumkin.

Agar derleyici nol bilan bo'linishni ba'zi kodni bajarganingizda amalga oshirsa va kompilyator o'z foydalanuvchilariga yoqimli bo'lsa, u ehtimol sizga ogohlantirish beradi va ichki «bo'luvchi» ko'rsatma hosil qiladi, chunki xatti-harakatlar bir xil.

34
qo'shib qo'ydi
Ba'zan ular sizning ilovangizning qulashini kafolatlashdan boshqa narsalarni qilishadi. Misol uchun, ko'plab tillar/platformalar nolga bo'linish bo'yicha istisno qilishni kafolatlaydi. Keyin, yuqorida aytilgan istisnoni to'xtatmasdan qo'lga olishingiz mumkin.
qo'shib qo'ydi muallif Carl Norum, manba
"Intel 32bit va 64 bitli protsessorlarda" bo'linish "ko'rsatmalari nolga bo'linganingizda dasturni buzadi." Citation kerak. CPUlar ilovalar haqida hech qanday tasavvurga ega emaslar, ko'rsatmalarni bajaradilar va (agar biz MMU ni qo'shsak) xotira erkinligini cheklashni amalga oshiradi (agar ohangli 0 yoki Intel-x86 bo'lmagan arxitekturada teng). Buyruqlar B ilovasi yoki Operatsion tizimining komponenti emas, balki A ilovasining bir qismi bo'lishi CPU bilan alohidadir; yo'riqnoma X ko'rsatmasi yoki X xotira manzilidan foydalanish mumkinmi.
qo'shib qo'ydi muallif Pacane, manba
"Boshqa protsessorlar boshqacha yo'l tutishlari mumkin" ichida "may" ni o'chirishingiz mumkin: PowerPC platformasida bo'linish nolga teng bo'linishda nol natija beradi. Qaysi X86 platformasi panicking harakatlaridan ko'ra ko'proq foydali.
qo'shib qo'ydi muallif cmaster, manba
@ MichaelKjörlingga sharh qo'shish uchun: OS bu (va boshqa xatoliklar) ilovasini notifika qilish yo'llari bor. Windows dunyosida EXCEPTION_RECORD ichida (umid qilamanki) o'rnatilgan EXCEPTION_INT_DIVIDE_BY_ZERO qiymati tuzilgan istisno ishlov berish
qo'shib qo'ydi muallif A.Jesin, manba

Agar kimdir sizni ajratmasdan oldin nolga aniqlik kiritmagan CPU qilsa, nima bo'lishini bilasiz. Nima bo'lar edi, bu butunlay bo'linishning amalga oshirilishiga bog'liq. Tafsilotlargacha kirmasdan, bir turdagi dastur barcha bitlarni o'rnatgan, masalan, 65535 16 bitli CPUda. Yana birov to'xtatishi mumkin.

13
qo'shib qo'ydi

Biz bilamizki, x/0 va 0/0 da yaxshi javob berilmagan. Agar siz 0/0 ni hisoblashga harakat qilsangiz nima bo'ladi?

Zamonaviy tizimda hisoblash protsessor ichida MPUga o'tkaziladi va NaN kodini qaytarib beradigan noqonuniy operatsiya deb belgilanadi.

Ko'proq eski tizimda, masalan, 80-sonli uy-joy kompyuterlari chip-bo'linmali bo'linmaga ega bo'lmagan holda, hisob-kitoblar har qanday dasturiy ta'minot orqali amalga oshirildi. Bir necha imkoniyat bor:

  • Subtract smaller and smaller copies of the divisor until the value reaches zero and keep track of which sized copies were subtracted
    • If it checks for zero before the first subtraction, it will exit quickly and the result will be 0
    • If it assumes it must be able to subtract at least once, the result will be 1
  • Calculate the logarithms of both numbers, subtract them and raise e to the power of the result. A very inefficient method compared to the above subtraction method, but mathematically valid
    • An overflow might occur trying to calculate log(0) and the software would either use its error handling routines, or crash
    • The software might assume that all logarithms can be calculated in a fixed number of steps and return a large, but incorrect value. Since both logarithms would be the same, the difference would be 0 and e0 = 1, giving a result of 1

Boshqacha aytganda, nima bo'lishidan qat'iy nazar amalga oshirishga bog'liq bo'ladi va har qanday qiymat uchun to'g'ri va bashoratli natijalar ishlab chiqaruvchi dasturiy ta'minotni yozish mumkin bo'ladi, biroq u hali ham ichki holatga ega bo'lgan 0/0 uchun g'alati qadriyatlardir izchil.

2
qo'shib qo'ydi
Hech bir protsessor loglarni hisoblab chiqadi va bo'linish natijalarini hisoblab chiqadi. Logaritm buyruqlar vaqti - bu bo'linishdan kattaroq buyuk buyruqlar. Jurnalning qiymati (0) nima?
qo'shib qo'ydi muallif andrey, manba
Bu savol tamsaytlarda nolga bo'linish haqida va butun sonlarda NaN kabi narsalar yo'q.
qo'shib qo'ydi muallif Ben, manba
@DavidHammen OP hech qachon aniq raqamlar haqida gapirmadi va bu savolga hech kim izoh bermadi. Tamsalar faqatgina javobda ko'rsatiladi.
qo'shib qo'ydi muallif CJ Dennis, manba
@wallyk Men javobimga ko'ra, bu logarifalar bo'linish uchun juda samarasiz deganidir. Arifmetik uchun xarajat (qo'shimcha = yig'ish) <= ko'paytirish <= bo'linish hisoblanadi. Agar sizda bir xil soat sikllarida (odatda bitta) qo'shilish kabi bir qismni ajratib oladigan MPU bo'lmasa, bo'linish qo'shib qo'yish va olib tashlashdan ko'ra qimmatroq va odatda ko'payishdan ham qimmatroq.
qo'shib qo'ydi muallif CJ Dennis, manba

Biroq, men kompyuterni hatto "nol" deb ajratishga urinayotgan bo'lsa yoki "himoyalanish" ga ega bo'lsa, bu "0" ko'rganda, xatoga yo'l qo'ymasdan oldin xatolikni qaytaradi. hisoblashingiz mumkinmi?

Chunki x/0 hech qanday mantiqqa ega emas, vaqt kompyuterlar har doim bo'linishni nolga qarashlari kerak. Bu yerda muammo bor: dasturchilar bu hisob-kitobning mantiqiyligini tekshirishni xohlamasdan, (a + b)/c ni hisoblashni xohlashadi. CPU + raqamining turi + operatsion tizim + tili tomonidan bo'linishning pastki qismiga nisbatan javob, juda murakkab narsa (masalan, dasturning qulashi) yoki juda yaxshi xulqli ish qilish (masalan, IEEE suzuvchi nuqta NaN , "No Number" raqami kabi ma'noga ega).

Oddiy sharoitda dasturchi kodi (a + b)/c mantiqiyligini bilishi kutilmoqda. Shu nuqtai nazardan, bo'linishni nolga qarab tekshirish uchun hech qanday sabab yo'q. Nolga bo'linish yuz bersa va kompyuter tili + dastur tili + ma'lumotlar turi + operatsion tizimiga javob bo'lsa, dastur buzilmaydi. Agar javob, dasturning har bir sonini oxirigacha ifloslantirishi mumkin bo'lgan qiymat hosil qilsa, bu ham yaxshi bo'ladi.

Dunyoda yuqori ishonchliligini hisoblash uchun nima qilish kerak bo'lgan "qattiq narsa" yoki "juda xayrixoh". Ushbu standart javoblar bemorni o'ldirishi, samolyot halokatga uchrashi yoki noto'g'ri joyda portlashi mumkin. Yuqori ishonchlilik muhitida kodni tekshirish vaqtida, yoki (a + b)/c ni yozadigan dasturchi o'limga olib boriladi yoki hozirgi vaqtda, ehtimol, verboten qurilishlar. Ushbu muhitda ushbu dasturchi div (add (a, b), c) (va ehtimol, ayrim xato holatini tekshirish) satrlari bo'ylab biror narsa yozgan bo'lishi kerak. Kaputning tagida div (va add ) funktsiyalari/makrolar nolga bo'linishni (yoki add case ifodasi) qarshi himoya qiladi. . Ushbu himoya qilish nimani anglatishini juda yaxshi bajaradi.

1
qo'shib qo'ydi
NaN maktabda o'rgangan arifmetikka itoat qilmasligi, bu no ma'nosini anglatmaydi degani emas. turli arifmetikasiga bo'ysunadi
qo'shib qo'ydi muallif Caleth, manba
Matematiklar
Matematiklar
633 ishtirokchilar

Kanalga obuna buling @Matematikak Masala va misollar yechimlari uchun guruh Guruhda faqat matematikaga oid ma'lumot bo'lishi shart.

MATEMATIKA GRANT
MATEMATIKA GRANT
356 ishtirokchilar

Guruh muallifi : @Yusupov_Ahadjon Guruh rasmiy kanali @dtm_axborotnoma Kimda chiqmagan misoli bo'lsa guruhga jo'natishi mumkin! Guruh qoidalari Chat Reklama Soʻkingan Futbol Sticker Xamma bir birini xurmat qilsin