এনএএন বক্সিংয়ের উদ্দেশ্য কী?


44

পড়া 21 শতকের সি আমি অধ্যায়ের 6 আগত অধ্যায় এ "Nans সঙ্গে ব্যতিক্রমী সংখ্যাসূচক মান চিহ্নিত" , যেখানে এটি অংশক বিট ব্যবহার ব্যাখ্যা করে, কিছু নির্বিচারে বিট নিদর্শন সংরক্ষণ করতে তাদের চিহ্নিতকারী বা পয়েন্টার (বই উল্লেখ হিসাবে ব্যবহার করার জন্য ওয়েবকিট এই কৌশলটি ব্যবহার করে)।

আমি এই কৌশলটির ইউটিলিটি বুঝতে পেরেছি বলে আমি সত্যই নিশ্চিত নই, আমি হ্যাক হিসাবে দেখছি (এটি একটি এনএএন-তে ম্যান্টিসার মান যত্নশীল নয় এমন হার্ডওয়ারের উপর নির্ভর করে) তবে জাভা ব্যাকগ্রাউন্ড থেকে আসছি আমি অভ্যস্ত নই সি এর রুক্ষতা

এখানে কোডের স্নিপেট যা কোনও এনএএন-তে চিহ্নিতকারীকে সেট করে এবং পড়ে reads

#include <stdio.h>
#include <math.h> //isnan

double ref;

double set_na(){
    if (!ref) {
        ref=0/0.;
        char *cr = (char *)(&ref);
        cr[2]='a';
    }
    return ref;
}

int is_na(double in){
    if (!ref) return 0;  //set_na was never called==>no NAs yet.

    char *cc = (char *)(&in);
    char *cr = (char *)(&ref);
    for (int i=0; i< sizeof(double); i++)
        if (cc[i] != cr[i]) return 0;
    return 1;
}

int main(){
    double x = set_na();
    double y = x;
    printf("Is x=set_na() NA? %i\n", is_na(x));
    printf("Is x=set_na() NAN? %i\n", isnan(x));
    printf("Is y=x NA? %i\n", is_na(y));
    printf("Is 0/0 NA? %i\n", is_na(0/0.));
    printf("Is 8 NA? %i\n", is_na(8));
}

এটি মুদ্রণ:

Is x=set_na() NA? 1
Is x=set_na() NAN? 1
Is y=x NA? 1
Is 0/0 NA? 0
Is 8 NA? 0

এবং জেএসভ্যালু। এ ওয়েবকিট এনকোডিংয়ের ব্যাখ্যা দেয়, তবে কেন এটি ব্যবহার করা হয় তা নয়।

এই কৌশলটির উদ্দেশ্য কী? স্থান / পারফরম্যান্সের সুবিধাগুলি কি এর হ্যাকিশ প্রকৃতির ভারসাম্য বজায় রাখার পক্ষে যথেষ্ট বেশি?


আপনি একটি সহজ উদাহরণ প্রদান করতে পারেন?
BЈовић

পরিষ্কার করতে ওপি জিজ্ঞাসা করছে যেখানে এনএএন সিগন্যালিং ব্যবহার করা যেতে পারে
ratchet freak

1
@ratchetfreak, আপনি কি এমন ভাবনা তৈরি করেন?
উইনস্টন ইওয়ার্ট

@ আর্টচেতফ্রাক: প্রশ্নটি এনএএন সিগন্যালিং সম্পর্কিত নয়, যেমন ওয়েবকিট জেএসভালিউ এইচ ব্যাখ্যা করেছেন, তবে আমাকে নতুন কিছু আবিষ্কার করার জন্য আপনাকে ধন্যবাদ!
andijcr

1
@ হডসন ইসনান () সি মূল দ্বিতীয় প্রিন্টফে ব্যবহৃত হয়েছে। Is_an () এর উদ্দেশ্যটি পরীক্ষা করা হয় যদি ডাবল ইনপুটটির বিট প্যাটার্নটি রেফ গ্লোবাল ভেরিয়েবলের ভিতরে সেভ করা সমান হয়।
andijcr

উত্তর:


63

আপনি যখন একটি গতিশীল টাইপিত ভাষা প্রয়োগ করছেন, আপনার কাছে এমন একক প্রকার পাওয়া যাবে যা আপনার যে কোনও অবজেক্টকে ধরে রাখতে পারে। এর জন্য আমি সচেতন তিনটি ভিন্ন পদ্ধতির রয়েছে:

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

অসুবিধাটি হ'ল সংখ্যার মতো ছোট মানগুলি বাক্সের মান হিসাবে সঞ্চিত হয়, তাই আপনার সামান্য 5 কোথাও মেমরির একটি ব্লক হিসাবে সঞ্চিত হয়। সুতরাং এটি আমাদের ইউনিয়ন পদ্ধতির দিকে নিয়ে যায়, যা লুয়া ব্যবহার করে। PyObject*একটির পরিবর্তে প্রতিটি মান হ'ল একটি কাঠামো যা কোন ক্ষেত্রটি প্রকার নির্দিষ্ট করতে হবে এবং তারপরে সমস্ত ভিন্ন ভিন্ন সমর্থিত ধরণের একটি ইউনিয়ন। এইভাবে আমরা ক্ষুদ্র মানগুলির জন্য কোনও মেমরি বরাদ্দ এড়াতে পরিবর্তে এগুলি সরাসরি ইউনিয়নে সঞ্চয় করে রাখি।

NaNডাবলস যেমন পদ্ধতির দোকানে সবকিছু, এবং অব্যবহৃত অংশের reuses NaNঅতিরিক্ত সঞ্চয়স্থান। ইউনিয়ন পদ্ধতির উপর সুবিধা হ'ল আমরা টাইপ ফিল্ডটি সংরক্ষণ করি। যদি এটি একটি বৈধ ডাবল, এটি দ্বিগুণ অন্যথায় ম্যান্টিসা হ'ল আসল বস্তুর পয়েন্টার।

মনে রাখবেন, এটি প্রতিটি জাভাস্ক্রিপ্ট অবজেক্ট। প্রতিটি পরিবর্তনশীল, একটি বস্তুর প্রতিটি মান, প্রতিটি অভিব্যক্তি। আমরা যদি তাদের সমস্ত 96 বিট থেকে 64 বিটগুলিতে হ্রাস করতে পারি যা বেশ চিত্তাকর্ষক is

এটি হ্যাক মূল্য? মনে রাখবেন দক্ষ জাভাস্ক্রিপ্টের জন্য প্রচুর চাহিদা রয়েছে। জাভাস্ক্রিপ্ট অনেকগুলি ওয়েব অ্যাপ্লিকেশনগুলির অন্তরায় এবং তাই এটি দ্রুত তৈরি করা একটি উচ্চ অগ্রাধিকার। পারফরম্যান্সের কারণে নির্দিষ্ট ডিগ্রী হ্যাকনেস যুক্ত করা যুক্তিসঙ্গত। বেশিরভাগ ক্ষেত্রে, এটি একটি খারাপ ধারণা হতে চাই, কারণ এটি অল্প লাভের জন্য কিছুটা জটিলতার পরিচয় দেয়। তবে এই নির্দিষ্ট ক্ষেত্রে, এটি স্মৃতিশক্তি এবং গতির উন্নতির জন্য উপযুক্ত।


2
আসলে সিপিথন অল্প সংখ্যক ক্যাশে করে। Hg.python.org/cpython/file/e6cc582cafce/Objects/longobject.c
ফিলিপ মেঘ

1
@ সিপি ক্লাউড, সত্য, তবে সেই বিশদটি যথাযথ বলে মনে হয় নি।
উইনস্টন এওয়ার্ট

1
@ উইনস্টনওয়ার্ট আপনি ঠিক বলেছেন আমি যা লিখেছিলাম তা পড়ার পরে আমি একই জিনিসটি ভেবেছিলাম।
ফিলিপ মেঘ

2
সমস্ত মানের "বক্সিং" এড়ানোর জন্য আদিম ধরণের বিট ব্যবহার করা সময়-সম্মানিত কৌশল। স্মলটালক ১৯ 1970০ এর দশকে এটি ব্যবহার করেছিল, কোনও বস্তুর পয়েন্টার বা 15-বিটের সিগন্যাল দেওয়ার জন্য 16-বিট ইন্টিজার থেকে এক বিট চুরি করেছিল SmallInteger
জোনাথন ইউনিস 21

2
@ জোনাথন ইউনিস, সত্যিই? এটি কেবল আমাকে বিস্মিত করে কারণ 16 বিটগুলির মধ্যে সত্যিই দীর্ঘ পরিসীমা নেই যা আমি কিছুটা দিতে চাই।
উইনস্টন ইওয়ার্ট

7

অতিরিক্ত বুলিয়ান ভেরিয়েবলের প্রয়োজনীয়তা এড়াতে "ব্যতিক্রমী মানগুলির" জন্য NaN ব্যবহার করা একটি সুপরিচিত এবং কখনও কখনও সহায়ক কৌশল this_value_is_invalid। বুদ্ধিমানের সাথে ব্যবহার করা, এটি তার কোডকে আরও সংক্ষিপ্ত, ক্লিনার, সহজ, আরও কার্যকরভাবে কোনও পারফরম্যান্স ট্রেড-অফ ছাড়াই তৈরি করতে সহায়তা করতে পারে।

এই কৌশলটির অবশ্যই কিছু অসুবিধা রয়েছে (এখানে দেখুন http://ppkwok.blogspot.co.uk/2012/11/java-cafe-1-never-write-nan-nan_24.html ) তবে জাভা (যেমন ভাষা) তে বা খুব অনুরূপ সি #) স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলি রয়েছে যেমন Float.isNaNNaN গুলি সহজসাধ্য করে তোলে। অবশ্যই, জাভা আপনি অন্যথায় ব্যবহার করতে পারে Floatএবং Doubleবর্গ এবং C # এ nullable মান ধরনের float?এবং double?, আপনি ব্যবহারের সম্ভাবনা দান nullঅবৈধ ফ্লোটিং পয়েন্ট সংখ্যার জন্য nan পরিবর্তে কিন্তু যারা কৌশল কর্মক্ষমতা এবং মেমরি উপর উল্লেখযোগ্য নেতিবাচক প্রভাব ফেলতে পারে আপনার প্রোগ্রাম ব্যবহার।

সি তে NaN এর ব্যবহার 100% পোর্টেবল নয়, এটি সত্য তবে আপনি যেখানেই আইইইই 754 ভাসমান পয়েন্ট স্ট্যান্ডার্ড উপলব্ধ সেখানে এটি ব্যবহার করতে পারেন। এএফআইএকে এটি আজ প্রায় প্রতিটি মূলধারার হার্ডওয়্যার (বা কমপক্ষে কমপ্লেয়ারগুলির রানটাইম পরিবেশ এটি সমর্থন করে)। উদাহরণস্বরূপ, এই এসও পোস্টে সিএএনএএনএন ব্যবহার সম্পর্কে আরও বিশদ জানতে কিছু তথ্য রয়েছে


জাভাতে অটো-বক্সিং অগোছালো এবং এড়ানো উচিত, কেবল একটি নাল মান প্রদান করতে সক্ষম হয়ে এটি ব্যবহার করা হাস্যকর এবং বাগের ঝুঁকির মধ্যে রয়েছে
ratchet freak

ওয়েবকিট যেখানে এনএএন-বক্সিং ব্যবহার করে সেখানে লিঙ্ক করতে আমি প্রশ্নটি সম্পাদনা করেছি। দেখে মনে হচ্ছে যে ওয়েবকিটটির '
এনএএন

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