ধ্রুবক 0.0039215689 কী উপস্থাপন করে?


309

আমি বিভিন্ন গ্রাফিক্স শিরোলেখ ফাইলগুলিতে এই ধ্রুবকটি পপ আপ করে দেখছি

0.0039215689

মনে হচ্ছে রঙের সাথে কিছু করার আছে?

গুগলে প্রথম হিট এখানে :

void RDP_G_SETFOGCOLOR(void)
{
    Gfx.FogColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f;
    Gfx.FogColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f;
    Gfx.FogColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f;
    Gfx.FogColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f;
}

void RDP_G_SETBLENDCOLOR(void)
{
    Gfx.BlendColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f;
    Gfx.BlendColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f;
    Gfx.BlendColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f;
    Gfx.BlendColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f;

    if(OpenGL.Ext_FragmentProgram && (System.Options & BRDP_COMBINER)) {
        glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 2, Gfx.BlendColor.R, Gfx.BlendColor.G, Gfx.BlendColor.B, Gfx.BlendColor.A);
    }
}

//...more like this

এই সংখ্যাটি কী উপস্থাপন করে? কেন কেউ এটিকে কনস্ট হিসাবে ঘোষণা করে না?

গুগলে এটি ব্যাখ্যা করে এমন কোনও কিছুই আমি পাইনি।


16
সোর্স কোড এর পরিবর্তে এটি লেখার কোনও কারণ আছে (1.f/255)?
এমএম

53
ম্মম্ম ... যদি যাদু সংখ্যাগুলি এড়াতে কিছু উপায় থাকত ....
পল ড্রাগার

12
1/255 == 0.00(3921568627450980)- পেরেন্স মানে পুনরাবৃত্তি।
jfs

82
আপনার পরবর্তী ম্যাজিক নম্বরটি সহ,
ওল্ফ্রাম

12
যে কারণেই হোক না কেন, তার উদ্দেশ্যটি দলিল না করেই একটি যাদু নম্বর ব্যবহার করা খুব অসম্পূর্ণ
আইজাক রবিনোভিচ ২

উত্তর:


378

0.0039215689প্রায় সমান 1/255

এটি ওপেনজিএল দেখে পারফরম্যান্স সম্ভবত গুরুত্বপূর্ণ। সুতরাং এটি অনুমান করা সম্ভবত নিরাপদ যে এটি কার্য সম্পাদনের কারণে করা হয়েছিল।

পারস্পরিক ক্রিয়াকলাপের সাথে গুণিত করা 255 দ্বারা বারবার ভাগ করার চেয়ে দ্রুত।


সাইড নোট:

আপনি যদি ভাবছেন যে কেন এই ধরনের একটি মাইক্রো-অপ্টিমাইজেশান সংকলককে ছেড়ে যায় না, কারণ এটি একটি অনিরাপদ ভাসমান-পয়েন্ট অপটিমাইজেশন। অন্য কথায়:

x / 255  !=  x * (1. / 255)

ভাসমান-পয়েন্ট রাউন্ড-অফ ত্রুটির কারণে।

সুতরাং আধুনিক সংকলকগণ এই অপটিমাইজেশনটি করার জন্য যথেষ্ট স্মার্ট হতে পারে, তবে আপনি স্পষ্ট করে কোনও সংকলক পতাকার মাধ্যমে তা না বললে তাদের এগুলি করার অনুমতি দেওয়া হবে না।

সম্পর্কিত: জিসিসি কেন একটি * ক * এ * আ * আ * আ * ক * (এ * এ * ক) * (এ * এ * ক) কে অনুকূলিত করে না?


10
আমি আসলে এটি জানতাম না যখন আমি এটি প্রথম দেখলাম। তবে এটি যেভাবে ব্যবহৃত হয়েছিল তা দেখে আমার সন্দেহ হয়েছিল যে এটি ছিল বহুগুণে বাইরের পারস্পরিক অপ্টিমাইজেশন। তাই আমি আমার ক্যালকুলেটরটি পরীক্ষা করে দেখেছি এবং যথেষ্ট নিশ্চিত - আমি ঠিক অনুমান করেছি।
রহস্যময়

55
আমি এটি লিখিত হিসাবে দেখতে আশা করব a = b * (1.0f / 255); সংকলক এখনও ধ্রুবক ভাঁজ না, না?
ইলমারি করোনেন

9
@ ইলমারিকারনেন হ্যাঁ, তারা এখনও নিয়মিত ভাঁজ করে। এটি আসলে টেমপ্লেট রেজোলিউশনগুলির মতো কিছু সামগ্রীর জন্য প্রয়োজন। তবে আমি এটিকে কেবল ধ্রুবক বা ম্যাক্রো হিসাবে টেনে আনতাম। তবে আরে, সমস্ত কোড নিখুঁতভাবে লেখা হয় না। :)
রহস্যময়

5
প্রাথমিকভাবে, আমি একই জিনিসটি ভাবছিলাম। আপনি যদি 256 ব্যবহার করেন তবে এটি 0.0 - 0.996পছন্দসই পরিবর্তে স্কেল হবে 0.0 - 1.0। ( 0.996 = 255/256যেখানে 255বৃহত্তম 8-বিট পূর্ণসংখ্যা)
Mysticial

7
এবং অবশ্যই, আমার নিজের প্রশ্নের উত্তর দেওয়ার জন্য, এটি কারণ দুটি অন্যান্য সংখ্যা স্ট্যান্ডার্ড সি ভাসমান হিসাবে প্রতিনিধিত্ব করা যায় না। পরবর্তী ভাসমানটি 0.0039215689 এর নীচে 0.0039215684।
ড্যানিয়েল ওয়াচটার

79

এই গুণটি 0.0039215689f0 থেকে 255 এর মধ্যে একটি পূর্ণসংখ্যার মান রঙের তীব্রতাকে 0 থেকে 1 ব্যাপ্তির মধ্যে একটি বাস্তব মূল্যবান রঙের তীব্রতায় রূপান্তর করে ।

ইলমারি করোনেন যেমন উল্লেখ করেছেন, এটি যদি একটি অপ্টিমাইজেশন হয় তবে এটি বরং একটি খারাপভাবে প্রকাশিত। এটি দ্বারা গুণ করা এত স্পষ্ট হবে (1.0f/255)


5
বা হতে পারে আরও ভাল, ধ্রুবক হিসাবে সংজ্ঞায়িত?
জনি

9
@ জোনি অবশ্যই একটি ধ্রুবক হিসাবে সংজ্ঞায়িত হয়েছে। পয়েন্টটি যাদু মান নয়।
ডেভিড হেফারনান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.