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

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

7
ส่งไปยัง int vs floor
มีความแตกต่างระหว่างสิ่งเหล่านี้หรือไม่: float foo1 = (int)(bar / 3.0); float foo2 = floor(bar / 3.0); ตามที่ฉันเข้าใจทั้งสองกรณีมีผลเหมือนกัน มีความแตกต่างในโค้ดที่คอมไพล์หรือไม่?
120 c++  c  floating-point 

5
รากที่สองผกผันอย่างรวดเร็วผิดปกติของ John Carmack (Quake III)
John Carmack มีฟังก์ชันพิเศษในซอร์สโค้ด Quake III ซึ่งคำนวณค่ารากที่สองผกผันของการลอยซึ่งเร็วกว่าปกติ 4 เท่า(float)(1.0/sqrt(x))รวมถึง0x5f3759dfค่าคงที่แปลก ๆ ดูโค้ดด้านล่าง ใครช่วยอธิบายทีละบรรทัดว่าเกิดอะไรขึ้นที่นี่และเหตุใดจึงทำงานได้เร็วกว่าการใช้งานปกติมาก float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; i = 0x5f3759df - ( i >> …

29
การตัดทอนลอยใน Python
ฉันต้องการลบตัวเลขออกจากทศนิยมเพื่อให้มีจำนวนหลักคงที่หลังจุดเช่น: 1.923328437452 -> 1.923 ฉันต้องการส่งออกเป็นสตริงไปยังฟังก์ชันอื่นไม่ใช่พิมพ์ นอกจากนี้ฉันต้องการละเว้นตัวเลขที่หายไปไม่ใช่ปัดเศษ

7
การแปลงสตริงให้ลอยใน C #
ฉันกำลังแปลงสตริงเช่น "41.00027357629127" และฉันกำลังใช้; Convert.ToSingle("41.00027357629127"); หรือ float.Parse("41.00027357629127"); วิธีการเหล่านี้กลับ4.10002732E + 15 เมื่อฉันแปลงเป็นลอยฉันต้องการ "41.00027357629127" สตริงนี้ควรจะเหมือนกัน ...

2
อะไรคือความแตกต่างระหว่าง NaN ที่เงียบและ NaN การส่งสัญญาณ?
ฉันได้อ่านเกี่ยวกับจุดลอยตัวและฉันเข้าใจว่า NaN อาจเป็นผลมาจากการดำเนินการ แต่ฉันไม่เข้าใจว่านี่คือแนวคิดอะไรกันแน่ อะไรคือความแตกต่างระหว่างพวกเขา? สิ่งใดที่สามารถผลิตได้ในระหว่างการเขียนโปรแกรม C ++ ในฐานะโปรแกรมเมอร์ฉันสามารถเขียนโปรแกรมที่ทำให้เกิด sNaN ได้หรือไม่

6
เหตุใด SSE สเกลาร์ sqrt (x) จึงช้ากว่า rsqrt (x) * x
ฉันได้จัดทำโปรไฟล์หลักคณิตศาสตร์ของเราใน Intel Core Duo และในขณะที่ดูวิธีการต่างๆของสแควร์รูทฉันสังเกตเห็นว่ามีอะไรแปลก ๆ : การใช้การดำเนินการสเกลาร์ SSE การใช้สแควร์รูทซึ่งกันและกันเร็วกว่าและคูณ เพื่อรับ sqrt มากกว่าที่จะใช้ opcode sqrt ดั้งเดิม! ฉันกำลังทดสอบด้วยการวนซ้ำเช่น: inline float TestSqrtFunction( float in ); void TestFunc() { #define ARRAYSIZE 4096 #define NUMITERS 16386 float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 ) float flOut [ ARRAYSIZE …

11
ควรเพิ่มการลอยตัวในลำดับใดเพื่อให้ได้ผลลัพธ์ที่แม่นยำที่สุด
นี่เป็นคำถามที่ฉันถูกถามในการสัมภาษณ์ล่าสุดของฉันและฉันอยากรู้(ฉันจำทฤษฎีการวิเคราะห์ตัวเลขไม่ได้จริง ๆ โปรดช่วยฉันด้วย :) หากเรามีฟังก์ชันบางอย่างซึ่งสะสมตัวเลขทศนิยม: std::accumulate(v.begin(), v.end(), 0.0); vเป็นstd::vector<float>ตัวอย่างเช่น จะดีกว่าไหมหากเรียงลำดับตัวเลขเหล่านี้ก่อนสะสม คำสั่งใดที่จะให้คำตอบที่แม่นยำที่สุด ฉันสงสัยว่าการเรียงลำดับตัวเลขจากน้อยไปมากจะทำให้ข้อผิดพลาดของตัวเลขน้อยลงแต่น่าเสียดายที่ฉันไม่สามารถพิสูจน์ได้ด้วยตัวเอง ป.ล. ฉันตระหนักดีว่าสิ่งนี้อาจไม่เกี่ยวข้องกับการเขียนโปรแกรมในโลกแห่งความเป็นจริงเพียงแค่อยากรู้อยากเห็น

8
ตัวระบุความกว้าง Printf เพื่อรักษาความแม่นยำของค่าทศนิยม
มีตัวprintfระบุความกว้างที่สามารถนำไปใช้กับตัวระบุจุดลอยตัวที่จะจัดรูปแบบผลลัพธ์โดยอัตโนมัติเป็นจำนวนหลักสำคัญที่จำเป็นเช่นนั้นเมื่อสแกนสตริงกลับเข้าไปจะได้รับค่าทศนิยมเดิมหรือไม่ ตัวอย่างเช่นสมมติว่าฉันพิมพ์ a floatด้วยความแม่นยำของ2ตำแหน่งทศนิยม: float foobar = 0.9375; printf("%.2f", foobar); // prints out 0.94 เมื่อฉันสแกนผลลัพธ์0.94ฉันไม่มีการรับประกันที่เป็นไปตามมาตรฐานว่าฉันจะได้ค่า0.9375ทศนิยมดั้งเดิมกลับคืนมา (ในตัวอย่างนี้ฉันอาจจะไม่) ฉันต้องการวิธีบอกprintfให้พิมพ์ค่าทศนิยมไปยังจำนวนหลักที่จำเป็นโดยอัตโนมัติเพื่อให้แน่ใจว่าสามารถสแกนกลับไปเป็นค่าเดิมที่ส่งไปให้printfได้ ฉันสามารถใช้มาโครบางตัวfloat.hเพื่อหาค่าความกว้างสูงสุดที่จะส่งผ่านไปprintfได้ แต่มีตัวระบุให้พิมพ์โดยอัตโนมัติตามจำนวนหลักที่มีนัยสำคัญหรือไม่หรืออย่างน้อยก็เป็นความกว้างสูงสุด

4
float ใน Java คืออะไร?
ฉันเขียนรหัสนี้: float b = 3.6; และฉันได้รับสิ่งนี้: ข้อผิดพลาด: ปัญหาการคอมไพล์ที่ยังไม่ได้แก้ไข: ประเภทไม่ตรงกัน: ไม่สามารถแปลงจากคู่เป็นลอยได้ ทำไม? นิยามของfloatอะไร?

14
รูปแบบลอยด้วยโมดูล json มาตรฐาน
ฉันใช้โมดูล jsonมาตรฐานใน python 2.6 เพื่อจัดลำดับรายการลอย อย่างไรก็ตามฉันได้รับผลลัพธ์เช่นนี้: >>> import json >>> json.dumps([23.67, 23.97, 23.87]) '[23.670000000000002, 23.969999999999999, 23.870000000000001]' ฉันต้องการให้โฟลถูกสร้างด้วยทศนิยมสองหลักเท่านั้น ผลลัพธ์ควรมีลักษณะดังนี้: >>> json.dumps([23.67, 23.97, 23.87]) '[23.67, 23.97, 23.87]' ฉันได้ลองกำหนดคลาสตัวเข้ารหัส JSON ของตัวเองแล้ว: class MyEncoder(json.JSONEncoder): def encode(self, obj): if isinstance(obj, float): return format(obj, '.2f') return json.JSONEncoder.encode(self, obj) สิ่งนี้ใช้ได้กับวัตถุลอยตัว แต่เพียงผู้เดียว: >>> json.dumps(23.67, cls=MyEncoder) '23.67' แต่ล้มเหลวสำหรับวัตถุที่ซ้อนกัน: >>> …

10
“ f” หลังตัวเลข
อะไรfหลังจากตัวเลขที่บ่งบอก? นี่มาจาก C หรือ Objective-C? มีความแตกต่างในการไม่เพิ่มสิ่งนี้เป็นจำนวนคงที่หรือไม่? CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); คุณอธิบายได้ไหมว่าทำไมฉันถึงไม่เขียน: CGRect frame = CGRectMake(0, 0, 320, 50);

3
เป็นไปได้ไหมที่จะเขียนฟังก์ชัน InvSqrt () ของ Quake ใน Rust?
นี่เป็นเพียงเพื่อสนองความอยากรู้อยากเห็นของฉันเอง มีการดำเนินการตามนี้หรือไม่: float InvSqrt (float x) { float xhalf = 0.5f*x; int i = *(int*)&x; i = 0x5f3759df - (i>>1); x = *(float*)&i; x = x*(1.5f - xhalf*x*x); return x; } ในสนิม ถ้ามีอยู่โพสต์รหัส ฉันลองแล้วล้มเหลว ฉันไม่ทราบวิธีเข้ารหัสตัวเลขทศนิยมโดยใช้รูปแบบจำนวนเต็ม นี่คือความพยายามของฉัน: fn main() { println!("Hello, world!"); println!("sqrt1: {}, ",sqrt2(100f64)); } fn sqrt1(x: f64) -> f64 …

19
แปลง String เป็น Float ใน Swift
ฉันกำลังพยายามแปลงตัวเลขที่นำมาจาก UITextField ซึ่งฉันคิดว่าเป็นสตริงจริงและแปลงเป็น Float ดังนั้นฉันจึงสามารถคูณได้ ฉันมีสองตัวUITextfieldที่ประกาศดังนี้: @IBOutlet var wage: UITextField @IBOutlet var hour: UITextField เมื่อผู้ใช้กดปุ่ม UIButton ฉันต้องการคำนวณค่าจ้างที่ผู้ใช้ได้รับ แต่ฉันทำไม่ได้เพราะฉันต้องแปลงให้เป็นลอยก่อนจึงจะใช้งานได้ ฉันรู้วิธีแปลงเป็นจำนวนเต็มโดยทำสิ่งนี้: var wageConversion:Int = 0 wageConversion = wage.text.toInt()! อย่างไรก็ตามฉันไม่รู้ว่าจะแปลงเป็นลอยได้อย่างไร

11
การคำนวณจุดลอยตัวเทียบกับจำนวนเต็มบนฮาร์ดแวร์สมัยใหม่
ฉันกำลังทำงานที่มีความสำคัญต่อประสิทธิภาพใน C ++ และขณะนี้เรากำลังใช้การคำนวณจำนวนเต็มสำหรับปัญหาที่เกิดจากจุดลอยตัวเนื่องจาก "เร็วกว่า" สิ่งนี้ทำให้เกิดปัญหาที่น่ารำคาญมากมายและเพิ่มรหัสที่น่ารำคาญมากมาย ตอนนี้ฉันจำได้ว่าอ่านเกี่ยวกับวิธีการคำนวณจุดลอยตัวช้ามากประมาณ 386 วันซึ่งฉันเชื่อว่า (IIRC) มีตัวเลือกร่วมที่เป็นตัวเลือก แต่ในปัจจุบันด้วยซีพียูที่ซับซ้อนและทรงพลังมากขึ้นอย่างทวีคูณทำให้ "ความเร็ว" ไม่แตกต่างกันหากทำการคำนวณทศนิยมหรือจำนวนเต็ม? โดยเฉพาะอย่างยิ่งเนื่องจากเวลาในการคำนวณจริงนั้นมีขนาดเล็กเมื่อเทียบกับบางสิ่งเช่นการทำให้ท่อตันหรือดึงข้อมูลจากหน่วยความจำหลัก? ฉันรู้ว่าคำตอบที่ถูกต้องคือการเปรียบเทียบกับฮาร์ดแวร์เป้าหมายวิธีที่ดีในการทดสอบสิ่งนี้คืออะไร? ฉันเขียนโปรแกรม C ++ เล็ก ๆ สองโปรแกรมและเปรียบเทียบเวลาทำงานกับ "เวลา" บน Linux แต่เวลาทำงานจริงนั้นแปรปรวนเกินไป (ไม่ได้ช่วยให้ฉันทำงานบนเซิร์ฟเวอร์เสมือน) การใช้เวลาทั้งวันของฉันไม่เพียงพอกับการใช้เกณฑ์มาตรฐานหลายร้อยรายการการสร้างกราฟ ฯลฯ มีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อทดสอบความเร็วสัมพัทธ์ที่สมเหตุสมผล ความคิดหรือความคิด? ฉันผิดเต็ม ๆ เหรอ? โปรแกรมที่ฉันใช้ดังต่อไปนี้ไม่เหมือนกันโดยวิธีใด ๆ : #include <iostream> #include <cmath> #include <cstdlib> #include <time.h> int main( int argc, char** …

9
การตรวจสอบค่าทศนิยมเพื่อความเท่าเทียมกันเป็น 0 ปลอดภัยหรือไม่
ฉันรู้ว่าคุณไม่สามารถพึ่งพาความเท่าเทียมกันระหว่างค่าประเภทสองหรือทศนิยมได้ตามปกติ แต่ฉันสงสัยว่า 0 เป็นกรณีพิเศษหรือไม่ ในขณะที่ฉันสามารถเข้าใจความไม่ตรงระหว่าง 0.00000000000001 ถึง 0.00000000000002 แต่ 0 นั้นดูเหมือนจะค่อนข้างยากที่จะสับสนเนื่องจากไม่มีอะไรเลย หากคุณไม่เข้าใจอะไรเลยมันก็ไม่ใช่อะไรอีกแล้ว แต่ฉันไม่รู้เกี่ยวกับหัวข้อนี้มากนักจึงไม่เหมาะที่จะพูด double x = 0.0; return (x == 0.0) ? true : false; จะกลับมาจริงหรือไม่?

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