(1/(1/x)) har doim ham mukammal yumaloq safarmi?

x ning barcha raqamli va nol bo'lmagan qiymatlari uchun quyidagi holatlar haqiqiy emasmi?

bool IsRoundTrip(double x)
{
    double y = 1/(1/x);
    return x == y;
}

Qanday sharoitlar bir-biriga zid kelmaydi?

4
Matematik ravishda , x = 1/(1/x) kutilmagan xolatda x noldan tashqari.
qo'shib qo'ydi muallif djn, manba
Agar 0.0 soniyasida x o'qib chiqsangiz qanday natijaga erishasiz?
qo'shib qo'ydi muallif Doug McClean, manba
Sizning kompilyatoringiz/tarjimoningiz optimallashtirishda qanchalik yaxshi ekanligini bilib oladi. Y uchun vazifaning x bo'lishi kerak, shuning uchun bu funktsiya har doim to'g'ri bo'ladi. Shunday qilib, ish vaqtida haqiqiy baholashni amalga oshirmaydi.
qo'shib qo'ydi muallif Martin York, manba
@Esailija: Men sizning kompilyatoringizga bog'liq ekanini aytdim. x = 1/(1/x) matematik tarzda doimiy qiymatga (agar derleyici yaxshi bo'lsa) tushishi mumkin. Boshqa tomondan, ish vaqti versiyasi suzuvchi nuqta aniqligi muammosiga duch kelishi mumkin.
qo'shib qo'ydi muallif Martin York, manba
@LokiAstari lekin har doim ham to'g'ri emas, masalan: 1/(1/425.0) == 425.0 - bu FALSE
qo'shib qo'ydi muallif Ranch Hands, manba
nan va inf bilan nima sodir bo'ladi?
qo'shib qo'ydi muallif user38122, manba
@ Carson63000, men bekor qilishni kutib qolaman 0.0, shuning uchun "nol" bo'lmaganini nazarda tutdim.
qo'shib qo'ydi muallif zxq9, manba
Iltimos, uni sinab ko'ring.
qo'shib qo'ydi muallif Jamie Thomas, manba
Men x ning etarli darajada kichikligi uchun muvaffaqiyatsiz bo'lishini kutardim. Misol uchun, gccda x = 1e-310 ga teng bo'lsa, u holda 1/x gacha oqishi sababli bajarilmaydi.
qo'shib qo'ydi muallif Ruslan Imadiyev, manba

7 javoblar

Haqiqiy dasturni belgilash yo'li bilan narsalarni soddalashtirish uchun IEEE 754 64-bitlik suzuvchi nuqta haqida gapirayotganimizni boshqa javoblar sifatida qabul qilaman.

Har bir suzuvchi nuqta raqami uch qismdan iborat: belgisi, belgisi va mantissa. (Yashirin bitlarning texnik tafsilotlari bu munozara uchun ahamiyatsiz).

Qabul qilish belgisi ta'sir qilmaydi

1/(2**e * m) = (1/2**e) * (1/m) = 2**-e * (1/m) , so there are two ways in which the double-reciprocation can fail to provide a fixpoint. The easy one is that the exponent can be an extreme value such that we move from a denormalised number to one which overflows. The second is that the mantissa can be a non-fixpoint of the double-reciprocation.

Tasodifiy mantissalarni sinash uchun oddiy dastur yozdim:

import java.util.Random;

strictfp class RoundTrip
{
    public static void main(String[] args)
    {
        long one = Double.doubleToLongBits(1.0);
        Random rnd = new Random();
        for (int i = 1; i < 1<<30; i++) {
            long mantissa = rnd.nextLong() & 0xfffffffffffffL;
            double x = Double.longBitsToDouble(one + mantissa);
            double y = 1/(1/x);
            if (x != y) {
                System.out.println(Long.toHexString(one + mantissa));
                System.out.println(x);
                System.out.println(y);
                break;
            }
        }
    }
}

Tezda bir nechta mahsulot chiqardi:

3ffeca41c09ebb2b
1.9243791126461456
1.9243791126461458

Agar dasturda javob topilsa, unda 2-dan 1-gacha ** 30 mantissa muvaffaqiyatsizlikka uchraydi. Engil o'zgarish bilan mantisalarning 17,15% ni muvaffaqiyatsiz bajargani aniqlandi.


Biroz qo'li bilan tahlil:

<0> (1, 2) ochiq oralig'ini o'z ichiga olgan 2 ** 52-1 mantissa mavjud va ular bir xil intervalgacha. Shu bilan bir xil intervalgacha bo'lgan mantissalar o'zaro kodni o'z ichiga olgan ochiq kodli (0.5, 1) ni o'z ichiga oladi. Shunga e'tibor beringki, bu oraliqda oxirgi nuqtada bir birlik (1ulp), ya'ni ketma-ket qiymatlar orasidagi farq ulp ning (1, 2) oralig'ida mutlaq qiymatiga ega. Ammo o'zaro javob berish chiziqli operatsiya emas, shuning uchun oraliqning ayrim qismlarida talab qilinadigan qiymatlarning zichligi boshqalarga qaraganda yuqori bo'ladi. Shuning uchun biz o'zaro munosabat in'ektsiz bo'lmaydi deb umid qilamiz.

(1, 2) da, 1ulp bilan farqli ravishda x va x + dx qadriyatlarini nazarda tuting. Agar ular xuddi shu o'zaro mantissaga taaluqli bo'lsalar, ulardan eng ko'pi aylanib yurishi mumkin. Ushbu to'qnashuv ehtimoli qanday?

x^-1 differentiates to -x^-2, so the difference between 1/x and 1/(x+dx) is approximately -dx/x^2, or -2dx/x^2 ulps, so a difference of one ulp before reciprocation gives a difference of -2/x^2 ulps after reciprocation. Given that the separation between two exactly representable values is 1ulp (by definition), and assuming (for simplification) no particular alignment between mantissas and reciprocal mantissas, we can estimate the probability of a collision as max(0, 1 - 2/x^2), and we can approximate the proportion of collisions as \int_1^2 max(0, 1 - 2/x^2) dx = \int_{\sqrt 2}^2 (1 - 2/x^2) dx = 3 - 2\sqrt 2 is approximately 0.1716. This is in very good agreement with my empirical results for the proportion of mantissas that don't round-trip, so it seems reasonable to hypothesise that a mantissa will round-trip unless its reciprocal collides with that of another mantissa, in which case only one of the two will round-trip.

26
qo'shib qo'ydi
@MichaelShaw, o'zaro o'zaro kelishuvga aylanishini kutishning mutlaqo bir sababi yo'q, bu ikki tomonlama o'zaro kelishuvning sharti bo'lar edi. Biroq, a) hech qanday isbotsiz dalilsiz ravishda kamida bitta raqamni aylanib chiqmaganligi o'rtasida farq bor; b) aylanib yurmagan mantislarning sonini hisoblash va oqlash; c) eng kamida bitta mantissa atrofida aylanishini isbotlash. Ampirik o'lchov qanchalik yaxshi yoki yomon ekanini ko'rsatadigan diqqat bilan tahlilni ko'rish juda qiziqadi.
qo'shib qo'ydi muallif TobiX, manba
@MarkAmery: Nima uchun siz bekor qilmaydigan ikki yaxlitlash xatosining misoli kerak, deb o'ylaysiz? Millionlab yagona aniqlikdagi suzuvchi nuqtali raqamlar bor, nima uchun biz ularni har doim ikkilanib-o'zgarib ketgan deb hisoblashimiz mumkin?
qo'shib qo'ydi muallif Michael Shaw, manba
@PeterTaylor: Mavjud bo'lgan juda ko'p turli xil yaxlitlash sxemalarini hisobga olgan holda va ko'plab imkoniyatlarni ishga solish kerakligini hisobga olsak, siz ta'kidlaganingizdek, bu isbot emas.
qo'shib qo'ydi muallif Michael Shaw, manba
Bu erda juda ko'p dahshatli javoblar bor, lekin bu, aslida so'ralgan savolga javob beradi. Ikkala o'zaro muloqatdan yuvarlama xatolar har doim ham bekor qilmasligini ko'rsatadigan hech qanday dalil yoki namuna ko'rsatmasdan, etarli darajada yaxshi deb o'ylagan va faqatgina "suzuvchi nuqta aniqligi" sababli "yo'q" degan odamlarning ko'p soniga ishonmayman (yoki siz aytmoqchi bo'lganidek, mantissalarning ikki tomonlama o'zaro munosabat nuqtalari mavjud emas: R). Katta +1 bo'lsa-da, bu hozirgi paytda biroz qisqagina va qo'rqinchli ko'rinadi.
qo'shib qo'ydi muallif Mark Amery, manba

Yo'q. Taklif o'rnida, 1/(1/49) mening qurilmamda 49.0000000000000000710542735760100185871124267578125 raqamiga ishlaydi.


Ko'proq mavhum argument uchun, N - intervalda [1, 2] ko'rsatiladigan suzuvchi nuqtali sonlar bo'lishi mumkin. (IEEE 754 ikkilamchi aniqlikda, N 2 ^ 52 bo'ladi). Ushbu guruh va [1/2, 1] oralig'ida suzuvchi nuqta raqamlari o'rtasida noaniq bir-bir xaritalash mavjud: belgisi. Shunday qilib, N-suzuvchi nuqta soni ham bor [1/2, 1].

Har bir intervalda [2 ^ k, 2 ^ (k + 1)), suzuvchi nuqta raqamlari bir xil intervalgacha teng. Shunday qilib:

  • With N floating point numbers in the interval [1/2, 1):
    • ~N/3 are in the interval [1/2, 2/3)
    • ~N/3 are in the interval [2/3, 5/6)
    • ~N/3 are in the interval [5/6, 1)
  • With N floating-point numbers in the interval [1, 2):
    • N/2 are in the interval [1, 3/2)
    • N/2 are in the interval [3/2, 2)

Intervalda [3/2, 2] N/2 suzuvchi nuqta raqamlari intervalda (1/2, 2/3) o'zaro javoblarga ega, ammo bu qatorda faqatgina N/3 suzuvchi nuqta soni mavjud. Shuning uchun, qora tanlilar prensipiga ko'ra, bir xil suzuvchi nuqta o'zaro munosabatiga ega bo'lgan ikkita alohida suzuvchi nuqta soni mavjud.

4
qo'shib qo'ydi
Go'ng dog'i tamoyilidan yaxshi foydalanish. Bu to'qnashuvlar soni uchun taxminiy o'lchovim bilan tenglashish uchun uzaytirilishi mumkin. (1, 2) ichida x uchun, (x, 2) diapazoni (0.5, x - 1) , shuning uchun ulpdagi farq to'qnashuvning nisbati kamida (2 - x) - 2 (x ^ -1 - 0.5) = 3 - x - 2x ^ -1 . Differentiatsiya: bu -1 + 2x ^ -2 = 0 yoki x ^ 2 = 2 bo'lsa, bu extrema bor. Faqat ijobiy ildiz oralig'ida, shuning uchun to'qnashuvlar nisbati kamida 3 - sqrt (2) - 2/sqrt (2) = 3 - 2sqrt (2) ga teng.
qo'shib qo'ydi muallif TobiX, manba

Birinchi yoki ikkinchi bo'linmaning yaxlitlash xatoligidan tashqari, IEEE suzuvchi nuqtasi + va - abadiy va NaN (Not Number), shuningdek nol, bu sizning haqiqiy raqamlar uchun formulangiz bilan ishlamaydi (ya'ni matematik ajralmaslik , kompyuter saqlash formatidan ko'ra).

Oddiy maxsus holatlarga (nol, cheksiz, NaN) kirmasdan, haqiqiy natijaga erishishning yagona usuli - bu bekor qilinadigan ikki yaxlitlash xatosi bo'lsa yoki raqam to'liq aniqlangan bo'lsa IEEE suzuvchi nuqtasida. IEEE suzuvchi nuqtasi uchun bir necha turdagi yaxlitlash sxemalari mavjudligi sababli va apparat vakolatga qaraganda ko'proq bitlarni saqlab qolishi mumkin, shuning uchun hamma narsalarni to'g'ri saqlashga harakat qilish, yaxlitlashni bekor qilish vaqtini oldindan aytib berish qiyin va apparatga bog'liq.

Bu suzuvchi nuqta bilan shug'ullanish uchun ixtiro qilingan narsa emas.

3
qo'shib qo'ydi

No, it is not always a round trip. In mathematics (i.e., the kind your write on paper with a pencil), it will be, because mathematics doesn't have a problem with limited precision. But in any finite-precision system (e.g., any computer), there will be quantities of the form x != 1/(1/x). It's downright trivial to prove - when x is 3, finite-precision decimal arithmetic cannot make 1/(1/3) come out to 3. 1/3 => 0.33333..., and no matter how many digits you extend it to, you'll still be incorrect. Finite-precision binary arithmetic has the same problem with other values.

2
qo'shib qo'ydi
Siz buni 1/x to'liq aniqlik bilan taqdim eta olmasligidan xulosa qila olmaysiz. 1/(1/x)! = X . Sizning namunangizni olish uchun 3.s.f. o'nlik kasr nuqtasi, 1.00/3.00 = 0.333, 1.00/0.333 esa 3.00. Ushbu maxsus mantissa bu suzuvchi nuqta sxemasida ikki tomonlama o'zaro kelishilgan nuqtadir.
qo'shib qo'ydi muallif TobiX, manba

Derleyici hisobni optimallashtiradigan har qanday holatda bu to'g'ri bo'ladi deb taxmin qilaman. Buning tashqari, tenglik tekshiruvi ikkilamchi hollarda dasturlash xatoligi hisoblanadi (agar sizning kompilyatoringiz/apparat birikmasi qarama-qarshilikni kafolatlaydigan bo'lsa, men bunga inonmasman). Bu sizning namunangiz bilan chegaralanib qolmaydi, lekin boshqa vaziyatlarda ham bo'lishi mumkin. Jadvalni ikki marta yozish va uni qayta o'qish va original qiymat bilan taqqoslash kabi hali ham xotirada bo'lishi mumkin.

2
qo'shib qo'ydi

Qoidaning qoidasi: Agar tilda "juft" deb nom berilgan bo'lsa, bu ko'pincha x qiymatlari uchun noto'g'ri bo'ladi.

"Ikkala" odatda "Double Precision Floating Point Number" ga qisqartiriladi. "Ikkilamchi aniqlik" deb aytadigan bo'lsak, u "son hassasiyet" degan ma'noni anglatadi, ya'ni bir nuqtada yaxlitlash sodir bo'ladi.

Ba'zi tillar, cheklangan vakolatga ega bo'lgan har qanday qiymatni saqlashga imkon beruvchi "O'zboshimchalik bilan aniq raqamlar" ni qo'llab-quvvatlaydi va odatda aniqlik yo'qotmasdan, bu raqamlar bilan matematikani bajarishi mumkin. Bu hali ham barcha variantlarni qamrab olmaydi, chunki ba'zi raqamlar faqat sonli vakillikka ega emas - masalan, 1/3 uchburchak 1,3333 ga yaqin, ammo ba'zi birlarsiz yozib bo'lmaydi

Bunga erishish uchun ayrim tillar "Symbolic numbers" ni qo'llab-quvvatlaydi, bu asosan raqamni "1/3" deb saqlaydi va bu shakl bilan matematikani bajarishi mumkin.

O'zboshimchalik bilan aniqlik va ramziy raqamlarni ishlatish, ishlashning yuqori xarajatiga ega, shuning uchun u "asosiy tillarda" keng tarqalgan emas. Ushbu shakllarni qo'llab-quvvatlaydigan tillar ham unifikatsiyalash moyilligiga ega va faqat "Raqam" nomi ostida barcha raqamlar turlariga qo'shiladi (lekin bu hech qanday yuqori aniqlikni qo'llab-quvvatlamaydi).

IEEE 754 Double Precision (IEEE 754 Double Precision) ga o'xshash (yoki juda ijobiy) turi.

Eslatma: Sizning kodingiz x = 3 uchun bajarilmasligi mumkin, chunki dastur 1/3 ni aniq tuta olmasa ham 1ni ushlab turish yo'li bilan ajratilganda o'xshash yaxlitlash xatolarini keltirishi mumkin va yana 3 bilan chiqadi.

Izoh 2: Kutubxonalarni o'z ichiga bo'lmagan ko'p tillar uchun o'zboshimchalik/ramziy matematikadan topasiz.

2
qo'shib qo'ydi
Empirik tarzda parolingiz qoidasi noto'g'ri: u
qo'shib qo'ydi muallif TobiX, manba
1/3 da ham simvolik algebra uchun yomon misoldir, chunki oddiy fraksiyonlar 1/3 ga teng. Aslida, fraksiyonlar OP funktsiyasi hech qanday muammo emas va juda arzon (eng yomoni, bu raqamni va mezoni ikki marta ko'chiradi, ularni har safar almashtirishadi).
qo'shib qo'ydi muallif Paul Muir, manba
Albatta, 1/3 da cheklangan tavsifga ega. 3 tagida, masalan, uning vakili 0.1 . Ajoyib darajada cheklangan.
qo'shib qo'ydi muallif Lawrence B. Crowell, manba
-1, chunki siz faqatgina suzuvchi fikrlarning cheklangan aniqligi so'rovini ko'rsatmasdan yoki hatto ko'rsatishga harakat qilsangiz, ga tegishli muammoni hal qilishiga sabab bo'lishi mumkinligini tushuntirgansiz. Bir oz sinov yoki kichik matematika bo'lmasa, ikkinchi diviziondagi yaxlitlik xatolari birinchi bo'linmaning yaxlitlash xatosini hech qachon, har doim yoki hech qachon bekor qiladimi, yo'qmi, men uchun juda aniq emas.
qo'shib qo'ydi muallif Mark Amery, manba

Suzuvchi nuqta raqamlari qanday aks ettirilganligi sababli ular bir xil bo'lmaslik ehtimoli bor.

Information on their numerical representation can be found at ... http://en.wikipedia.org/wiki/Floating-point

Ko'pincha, suzuvchi nuqta soni normallashadi. Raqam denormalized float bo'lsa, sizning algoritmingiz yolg'onga aylanishi mumkin. Yoki bo'lmasin, sizning kompilyatoringiz matematik tengdoshligini tan olish va unga asoslangan optimallashni tanlashni xohlaydi yoki siz talab qilgan narsani to'liq amalga oshirishga bog'liq bo'ladi.

Sizning algoritmingiz yolg'onchi bo'lishi mumkin bo'lgan boshqa holatlar ham bo'lishi mumkin, ammo bu mening fikrimcha birinchi bo'lib keladi.

1
qo'shib qo'ydi
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