इंटरपोलेशन फ़ंक्शंस के दो कार्यान्वयन यहां दिए गए हैं। तर्क u1
हमेशा 0.
और 1.
के बीच है।डबल-सटीक तर्कों से शुरू होने वाले 80-बिट विस्तारित परिशुद्धता कंप्यूटेशंस की गुण
#include <stdio.h>
double interpol_64(double u1, double u2, double u3)
{
return u2 * (1.0 - u1) + u1 * u3;
}
double interpol_80(double u1, double u2, double u3)
{
return u2 * (1.0 - (long double)u1) + u1 * (long double)u3;
}
int main()
{
double y64,y80,u1,u2,u3;
u1 = 0.025;
u2 = 0.195;
u3 = 0.195;
y64 = interpol_64(u1, u2, u3);
y80 = interpol_80(u1, u2, u3);
printf("u2: %a\ny64:%a\ny80:%a\n", u2, y64, y80);
}
साथ 80-बिट long double
रों एक सख्त आईईईई 754 मंच पर, interpol_64()
में सभी संगणना आईईईई 754 डबल परिशुद्धता के अनुसार किया, और 80-बिट बढ़ाया परिशुद्धता में interpol_80()
में कर रहे हैं। कार्यक्रम प्रिंट:
u2: 0x1.8f5c28f5c28f6p-3
y64:0x1.8f5c28f5c28f5p-3
y80:0x1.8f5c28f5c28f6p-3
मैं संपत्ति में दिलचस्पी है "परिणाम समारोह से वापस लौटे हमेशा होता है के बीच u2
और u3
"। यह गुण interpol_64()
का झूठा है, जैसा ऊपर main()
में मानों द्वारा दिखाया गया है।
क्या संपत्ति के पास interpol_80()
का सत्य होने का मौका है? यदि यह नहीं है, तो काउंटर उदाहरण क्या है? अगर हम जानते हैं कि u2 != u3
या उनके बीच न्यूनतम दूरी है तो क्या इससे मदद मिलती है? क्या इंटरमीडिएट कंप्यूटेशंस के लिए एक महत्वपूर्ण चौड़ाई निर्धारित करने के लिए कोई तरीका है जिस पर संपत्ति को सत्य होने की गारंटी दी जाएगी?
संपादित करें: मैंने कोशिश किए गए सभी यादृच्छिक मूल्यों पर, संपत्ति को आयोजित किया जब इंटरमीडिएट कंप्यूटेशंस आंतरिक रूप से विस्तारित परिशुद्धता में किया गया था। यदि interpol_80()
ने long double
तर्क लिया, तो काउंटर-उदाहरण बनाने के लिए अपेक्षाकृत आसान होगा, लेकिन यहां प्रश्न विशेष रूप से ऐसे फ़ंक्शन के बारे में है जो double
तर्क लेता है। यह एक काउंटर उदाहरण बनाने के लिए बहुत कठिन बनाता है, अगर कोई है।
नोट: एक संकलक पैदा x87 निर्देश interpol_64()
और interpol_80()
के लिए एक ही कोड उत्पन्न कर सकता है, लेकिन यह मेरे सवाल का स्पर्शरेखा है।
हैं आप सुनिश्चित हैं कि यह प्रोग्राम वास्तव में सटीक 80 बिट्स का उपयोग करता है? आईआईआरसी आधुनिक इंटेल/एएमडी मशीनों ने एसएसई और दोस्तों के साथ 128 एफपी इकाइयां बनाई हैं। – fuz
@FUZxxl "128-बिट एफपी इकाइयों" का मतलब है दो डबल-परिशुद्धता या 4 सिंगल-सटीक संख्याओं के वैक्टर। लेकिन आपके प्रश्न का उत्तर देने के लिए, हाँ, मुझे यकीन है। असेंबली यहां है: http://pastebin.com/GaM20WZS –
दोनों सामग्री और प्रस्तुति के लिए +1 –