โค้ดด้านล่างทำงานบน Visual Studio 2008 ที่มีและไม่มีการปรับให้เหมาะสม แต่ใช้ได้เฉพาะกับ g ++ โดยไม่มีการปรับให้เหมาะสม (O0)
#include <cstdlib>
#include <iostream>
#include <cmath>
double round(double v, double digit)
{
double pow = std::pow(10.0, digit);
double t = v * pow;
//std::cout << "t:" << t << std::endl;
double r = std::floor(t + 0.5);
//std::cout << "r:" << r << std::endl;
return r / pow;
}
int main(int argc, char *argv[])
{
std::cout << round(4.45, 1) << std::endl;
std::cout << round(4.55, 1) << std::endl;
}
ผลลัพธ์ควรเป็น:
4.5
4.6
แต่ g ++ ที่มีการปรับให้เหมาะสม ( O1
- O3
) จะส่งออก:
4.5
4.5
หากฉันเพิ่มvolatile
คีย์เวิร์ดก่อน t มันก็ใช้ได้ดังนั้นอาจมีข้อบกพร่องในการเพิ่มประสิทธิภาพบางประเภทหรือไม่
ทดสอบกับ g ++ 4.1.2 และ 4.4.4
นี่คือผลลัพธ์ของ ideone: http://ideone.com/Rz937
และตัวเลือกที่ฉันทดสอบกับ g ++ นั้นง่ายมาก:
g++ -O2 round.cpp
ผลลัพธ์ที่น่าสนใจยิ่งขึ้นแม้ว่าฉันจะเปิด/fp:fast
ตัวเลือกบน Visual Studio 2008 ผลลัพธ์ก็ยังคงถูกต้อง
คำถามเพิ่มเติม:
ฉันสงสัยว่าฉันควรเปิด-ffloat-store
ตัวเลือกนี้ตลอดเวลาหรือไม่?
เนื่องจากเวอร์ชัน g ++ ที่ฉันทดสอบนั้นมาพร้อมกับCentOS / Red Hat Linux 5 และ CentOS / Redhat 6
ฉันรวบรวมโปรแกรมจำนวนมากภายใต้แพลตฟอร์มเหล่านี้และฉันกังวลว่ามันจะทำให้เกิดข้อบกพร่องที่ไม่คาดคิดในโปรแกรมของฉัน ดูเหมือนจะยากเล็กน้อยในการตรวจสอบรหัส C ++ ทั้งหมดของฉันและไลบรารีที่ใช้ว่ามีปัญหาดังกล่าวหรือไม่ ข้อเสนอแนะใด ๆ ?
มีใครสนใจ/fp:fast
ไหมว่าทำไมถึงเปิด Visual Studio 2008 ก็ยังใช้งานได้ ดูเหมือนว่า Visual Studio 2008 จะเชื่อถือได้มากกว่าปัญหานี้มากกว่า g ++?