การปัดเศษจุดลอยตัว


13

หมายเลขจุดลอยตัว IEEE-754 สามารถ <1 (เช่นสร้างด้วยตัวสร้างตัวเลขสุ่มซึ่งสร้างตัวเลข> = 0.0 และ <1.0) คูณด้วยจำนวนเต็มบางส่วน (ในรูปจุดลอยตัว) เพื่อให้ได้จำนวนเท่ากับหรือมากกว่า จำนวนเต็มนั้นเนื่องจากการปัดเศษ

กล่าวคือ

double r = random() ; // generates a floating point number in [0, 1)
double n = some_int ;
if (n * r >= n) {
    print 'Rounding Happened' ;
}

นี่อาจเทียบเท่ากับการบอกว่ามี N และ R อยู่เช่นนั้นถ้า R เป็นจำนวนมากที่สุดน้อยกว่า 1 ซึ่งสามารถแสดงใน IEEE-754 ดังนั้น N * R> = N (โดยที่ * และ> = เหมาะสม IEEE- 754 ตัวดำเนินการ)

นี่มาจากคำถามนี้ตามเอกสารนี้และฟังก์ชั่นการสุ่ม postgresql


คุณสามารถพูดอะไรเกี่ยวกับช่วงของ N ได้หรือไม่นั่นคือมันเล็กพอที่จะแสดงอย่างแม่นยำใน IEEE-754 ที่มีความแม่นยำสองเท่าหรือไม่?
Pedro

@Pedro ในกรณีนี้ใช่มันจะเป็นจำนวนเต็มเล็กน้อย - เช่น 10 ฉันคิดว่าคุณกำลังบอกว่าถ้า N เป็นจำนวนเต็มขนาดใหญ่มากที่มีตัวเลขนัยสำคัญจำนวนมากมันอาจจะไม่สามารถแสดงได้อย่างแน่นอน
Cade Roux

ว่าถ้าแล้วลิตร( R × ลิตร( N ) )อาจจะมีขนาดใหญ่กว่าR N fl(N)>Nfl(R×fl(N))RN
Pedro

คำตอบ:


8

สมมติว่าใกล้เคียงที่สุดและจากนั้นN R < Nเสมอ (ระวังอย่าแปลงจำนวนเต็มที่ใหญ่เกินไป)N>0NR<N

ให้โดยที่c [ 1 , 2 )เป็นซิกนิฟิแคนด์และqคือเลขชี้กำลังเลขจำนวนเต็ม ให้1 - 2 - s = Rแล้วหาขอบเขตc2q=Nc[1,2)q12s=R

NR=c2q(12s)c2q2qs,

มีความเท่าเทียมกันและถ้าหาก 1 ด้านขวามือมีค่าน้อยกว่าNและเนื่องจาก2 - q - sมีค่าเท่ากับ0.5หน่วยในตำแหน่งสุดท้ายของNทั้งc = 1และ2 - q - 2 - q - sสามารถแทนได้อย่างแน่นอน (เนื่องจากNเป็นเรื่องปกติ และไม่ใช่ขนาดที่เล็กที่สุดปกติ) หรือc > 1และการปัดเศษที่ใกล้ที่สุดจะลดลง ในทั้งสองกรณีN Rน้อยกว่าNc=1N2qs0.5Nc=12q2qsNc>1NRN.


การปัดเศษขึ้นอาจทำให้เกิดปัญหาไม่ใช่ว่ามันควรจะถูกเลือกในการปรากฏตัวของผู้ใช้ที่ไม่สงสัย นี่คือ C99 บางส่วนที่พิมพ์"0\n1\n"บนเครื่องของฉัน

#include <fenv.h>
#include <math.h>
#include <stdio.h>

int main(void) {
    double n = 10;
    double r = nextafter(1, 0);
    printf("%d\n", n == (n * r));
    fesetround(FE_UPWARD);
    printf("%d\n", n == (n * r));
}

ฉันขอโทษฉันช้านิดหน่อยวันนี้ - ฉันมีปัญหาในการได้รับส่วนหนึ่งของความไม่เท่าเทียมกัน
c2q2s2qs
Cade Roux

@Cade เห็นได้ชัดว่าฉันไม่สามารถทำพีชคณิตในวันนี้ ฉันหมายถึง s 2qs
Tyrone

ขอบคุณฉันไม่แน่ใจว่ามีอีกขั้นตอนหนึ่งที่ฉันพลาดไปหรือไม่
เคด Roux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.