2012-05-03 14 views
7

क्या जीएलएसएल के पास +/- अनंतता या NaN के लिए कोई पूर्व परिभाषित स्थिरांक है? मैं एक समाधान के रूप यह कर रहा हूँ, लेकिन मुझे आश्चर्य है कि अगर वहाँ एक क्लीनर तरीका है:glsl अनंतता स्थिर

// GLSL FRAGMENT SHADER 
#version 410 

<snip> 

const float infinity = 1./0.; 

void main() 
{ 
    <snip> 
} 

मैं isinf समारोह के बारे में पता कर रहा हूँ, लेकिन मैं इतना है कि मेरी मदद नहीं करता है एक चर करने के लिए अनंत सौंपने होंगे।

+0

आपको अनंतता की क्या आवश्यकता है? – Shahbaz

+0

अनंतता का उपयोग करके मेरे कोड में बहुत सारे तर्क बचाते हैं: ' फ्लोट t0 = (d> = 0.)? टी: अनंतता; फ्लोट टी 1 = (डी> = 0.)? टी: अनंतता; टी = मिनट (टी 0, टी 1); ' – atb

+0

मेरा मानना ​​है कि एक बड़ा पर्याप्त मूल्य चुनना (आपके आवेदन के आधार पर) आसानी से चाल करना चाहिए। उदाहरण के लिए कहें '1e20' – Shahbaz

उत्तर

5

Nicol की तरह, पहले से परिभाषित स्थिरांक नहीं हैं।

हालांकि, ओपनजीएल 4.1 से, आपका समाधान कम से कम काम करने की गारंटी देता है और सही मूल्य को सही ढंग से उत्पन्न करता है।

उदाहरण के लिए देखें glsl 4.4 में:

4.7.1 रेंज और प्रेसिजन

...

हालांकि, उचित रूप से में एक गैर शून्य से 0 परिणाम विभाजित हस्ताक्षर किए गए आईईईई इंफ: यदि दोनों सकारात्मक और नकारात्मक शून्य लागू किए जाते हैं, तो सही ढंग से हस्ताक्षरित इंफ उत्पन्न होगा, अन्यथा pos इटिव इन्फ उत्पन्न होता है।

करते समय सावधान रहें आप ओपन के एक पुराने संस्करण हालांकि का उपयोग करें: glsl 4.0 में

उदाहरण के लिए यह कहते हैं:

4.1.4 तैरता

...

इसी प्रकार, जैसी स्थितियों का उपचार 0 एम द्वारा विभाजित y एक अनिर्दिष्ट परिणाम तक ले जाता है, लेकिन किसी भी स्थिति में ऐसी स्थिति में व्यवधान या प्रसंस्करण की समाप्ति नहीं होनी चाहिए।

3

इसके लिए कोई पूर्व परिभाषित स्थिरांक नहीं है, लेकिन isinf फ़ंक्शन है जो परीक्षण करने के लिए कुछ है या नहीं।

जबकि मैं इसमें हूं, क्या FLT_MAX FLT_EPSILON आदि जैसी अन्य चीजों के लिए स्थिरताएं हैं सी में हैं?

नहीं, वहां नहीं हैं।

संबंधित मुद्दे