คำถามติดแท็ก floating-point

จำนวนจุดลอยตัวเป็นการประมาณของจำนวนจริงที่สามารถแสดงช่วงที่ใหญ่กว่าจำนวนเต็ม แต่ใช้หน่วยความจำในปริมาณเท่ากันในราคาที่มีความแม่นยำต่ำ หากคำถามของคุณเกี่ยวกับข้อผิดพลาดทางคณิตศาสตร์เล็กน้อย (เช่นทำไม 0.2 + 0.1 เท่ากับ 0.300000001) หรือข้อผิดพลาดในการแปลงทศนิยมโปรดอ่านหน้า "ข้อมูล" ที่ลิงก์ด้านล่างก่อนโพสต์

2
วิธีการแบ่งส่วนใน Go
ฉันกำลังพยายามแบ่งส่วนง่ายๆใน Go fmt.Println(3/10) สิ่งนี้จะพิมพ์ 0 แทนที่จะเป็น 0.3 นี่เป็นเรื่องแปลก ใครช่วยบอกเหตุผลที่อยู่เบื้องหลังเรื่องนี้ได้ไหม ฉันต้องการดำเนินการทางคณิตศาสตร์ที่แตกต่างกันใน Go ขอบคุณ

4
การแปลงลอยเป็นสตริงโดยไม่ต้องปัดเศษ
ฉันกำลังทำโปรแกรมที่ด้วยเหตุผลที่ไม่จำเป็นต้องอธิบายต้องใช้ float เพื่อแปลงเป็นสตริงเพื่อนับด้วย len () อย่างไรก็ตาม str (float (x)) ส่งผลให้ x ถูกปัดเศษเมื่อแปลงเป็นสตริงซึ่งจะทำให้ทุกอย่างหลุดออกไป มีใครรู้วิธีแก้ไขหรือไม่? นี่คือรหัสที่ใช้หากคุณต้องการทราบ: len(str(float(x)/3))


9
ฉันจะแปลงสตริงเป็นตัวเลขใน Perl ได้อย่างไร
ฉันมีสตริงที่มีค่าทศนิยมและฉันต้องแปลงสตริงนั้นเป็นตัวแปรทศนิยม ตัวอย่างของสตริงที่ฉันมีคือ "5.45" และฉันต้องการค่าทศนิยมเพื่อที่ฉันจะได้เพิ่ม. 1 เข้าไป ฉันได้ค้นหาในอินเทอร์เน็ต แต่ฉันเห็นเพียงวิธีการแปลงสตริงเป็นจำนวนเต็ม

3
การร่ายสองครั้งไปยัง int ที่ไม่ได้ลงนามบน Win32 ถูกตัดทอนเป็น 2,147,483,648
รวบรวมรหัสต่อไปนี้: double getDouble() { double value = 2147483649.0; return value; } int main() { printf("INT_MAX: %u\n", INT_MAX); printf("UINT_MAX: %u\n", UINT_MAX); printf("Double value: %f\n", getDouble()); printf("Direct cast value: %u\n", (unsigned int) getDouble()); double d = getDouble(); printf("Indirect cast value: %u\n", (unsigned int) d); return 0; } เอาต์พุต (MSVC x86): INT_MAX: 2147483647 …

8
JavaScript: ปัดเศษเป็นทศนิยมจำนวนหนึ่ง แต่ตัดค่าศูนย์พิเศษออก
นี่คือสถานการณ์: ฉันได้รับเมื่อฉันควรจะได้รับ.9999999999999999 ฉันสามารถที่จะสูญเสียตำแหน่งทศนิยมของความแม่นยำได้ดังนั้นฉันกำลังใช้งานประเภทใดอยู่1.0.toFixed(15) ปัดเศษงาน 1.000000000000000แต่ปัญหาคือว่าฉันได้รับ มีวิธีปัดเศษเป็นทศนิยมกี่ตำแหน่ง แต่ตัดช่องว่างเพิ่มเติมหรือไม่? หมายเหตุ: .toPrecisionไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการระบุจำนวนตัวเลขหลังจุดทศนิยมเท่านั้น หมายเหตุ 2: ฉันใช้ไม่ได้.toPrecision(1)เพราะฉันต้องการรักษาความแม่นยำสูงสำหรับตัวเลขที่มีข้อมูลอยู่หลังจุดทศนิยม ตามหลักการแล้วจะมีตำแหน่งทศนิยมมากเท่าที่จำเป็น (สูงสุด 15 ตำแหน่ง)


2
วิธีที่ถูกต้อง / มาตรฐานในการตรวจสอบว่าความแตกต่างเล็กกว่าความแม่นยำของเครื่อง?
ฉันมักจะลงเอยในสถานการณ์ที่จำเป็นต้องตรวจสอบว่าความแตกต่างที่ได้รับนั้นสูงกว่าความแม่นยำของเครื่องหรือไม่ ดูเหมือนว่าเพื่อวัตถุประสงค์นี้ R .Machine$double.epsมีตัวแปรที่มีประโยชน์: อย่างไรก็ตามเมื่อฉันหันไปใช้ซอร์สโค้ด R เพื่อหาแนวทางเกี่ยวกับการใช้ค่านี้ฉันจะเห็นรูปแบบที่แตกต่างกันหลายแบบ ตัวอย่าง นี่คือตัวอย่างจากstatsห้องสมุด: t.test.R if(stderr < 10 *.Machine$double.eps * abs(mx)) chisq.test.R if(abs(sum(p)-1) > sqrt(.Machine$double.eps)) integrate.R rel.tol < max(50*.Machine$double.eps, 0.5e-28) lm.influence.R e[abs(e) < 100 * .Machine$double.eps * median(abs(e))] <- 0 princomp.R if (any(ev[neg] < - 9 * .Machine$double.eps * ev[1L])) เป็นต้น คำถาม วิธีการหนึ่งที่สามารถเข้าใจเหตุผลที่อยู่เบื้องหลังเหล่านั้นแตกต่างกันทั้งหมด10 *, 100 …

7
เมื่อใดจึงควรใช้ทศนิยมทศนิยมเทียบกับ
ฉันกำลังสร้าง API นี้และฐานข้อมูลจะเก็บค่าที่เป็นหนึ่งในค่าต่อไปนี้: ร้อยละ เฉลี่ย ประเมินค่า ฉันไม่รู้จะนำเสนอบางสิ่งบางอย่างว่าช่วงอยู่ระหว่าง 0 ถึง 100% ในตัวเลข มันควรจะเป็น 0.00 - 1.00 0.00 - 100.00 ทางเลือกอื่นใดที่ฉันไม่รู้ มีตัวเลือกที่ชัดเจนสำหรับสิ่งนั้นหรือไม่? วิธีทั่วโลกในการแสดงบนฐานข้อมูลบางอย่างที่เปลี่ยนจาก 0 ถึง 100% เปอร์เซ็นต์? จะไปต่อไปประเภทที่ถูกต้องคืออะไรมันลอยหรือทศนิยม? ขอบคุณ.

1
พฤติกรรมแปลก ๆ ของ (^) ใน Haskell
ทำไม GHCi ให้คำตอบที่ไม่ถูกต้องด้านล่าง GHCi λ> ((-20.24373193905347)^12)^2 - ((-20.24373193905347)^24) 4.503599627370496e15 Python3 >>> ((-20.24373193905347)**12)**2 - ((-20.24373193905347)**24) 0.0 อัพเดท ฉันจะใช้ฟังก์ชั่นของ Haskell (^) ดังนี้ powerXY :: Double -> Int -> Double powerXY x 0 = 1 powerXY x y | y < 0 = powerXY (1/x) (-y) | otherwise = let z = powerXY …

5
ผลรวมที่มีเสถียรภาพของตัวเลขที่สั่งซื้อ
ฉันมีจำนวนบวกของตัวเลขบวกจำนวนจุดลอยตัว ( std::vector<float>ขนาด ~ 1,000) ตัวเลขจะเรียงตามลำดับที่ลดลง ถ้าฉันรวมพวกเขาตามคำสั่ง: for (auto v : vec) { sum += v; } ฉันเดาว่าฉันอาจมีปัญหาเสถียรภาพเชิงตัวเลขเนื่องจากใกล้ถึงจุดสิ้นสุดของเวกเตอร์sumจะยิ่งใหญ่กว่าvมาก วิธีแก้ปัญหาที่ง่ายที่สุดคือสำรวจเวกเตอร์ในลำดับย้อนกลับ คำถามของฉันคือ: มีประสิทธิภาพเช่นเดียวกับกรณีไปข้างหน้า? ฉันจะมีแคชหายไปอีกหรือไม่ มีโซลูชันอัจฉริยะอื่น ๆ อีกหรือไม่

2
ไวยากรณ์ที่ถูกต้องของการเรียกใช้ pseudo-destructor สำหรับค่าคงที่แบบลอยตัว
พิจารณาโปรแกรมสาธิตต่อไปนี้ #include <iostream> int main() { typedef float T; 0.f.T::~T(); } Microsoft Visual Studio Community 2019โปรแกรมนี้เป็นโปรแกรมที่รวบรวมโดย แต่clangและgccออกข้อผิดพลาดเช่นนี้ prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T' 7 | 0.f.T::~T(); | ^~~~~ หากต้องการเขียนนิพจน์เช่น( 0.f ).T::~T()นั้นคอมไพเลอร์ทั้งสามจะคอมไพล์โปรแกรม ดังนั้นคำถามที่เกิดขึ้น: บันทึกนี้0.f.T::~T()ถูกต้องตามหลักไวยากรณ์หรือไม่ และถ้าไม่เช่นนั้นกฎเกี่ยวกับวากยสัมพันธ์คืออะไร?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.