পূর্ণসংখ্যার হেরফেরের মাধ্যমে একটি আইইইই 754 64-বিট বাইনারি ফ্লোটিং পয়েন্ট নম্বরটি প্রয়োগ করুন


12

(আপাতত আমি "সি" প্রশ্নটি ট্যাগ করেছি তবে আপনি যদি ইউনিয়নগুলিকে সমর্থন করে এমন অন্য কোনও ভাষা সম্পর্কে সচেতন হন তবে আপনি এটিও ব্যবহার করতে পারেন।)

আপনার টাস্কটি + - * /নিম্নলিখিত কাঠামোর জন্য চারটি মানক গাণিতিক অপারেটর তৈরি করা:

union intfloat{
    double f;
    uint8_t h[8];
    uint16_t i[4];
    uint32_t j[2]; 
    uint64_t k;
    intfloat(double g){f = g;}
    intfloat(){k = 0;}
}

যেমন অপারেশনগুলি কেবলমাত্র পূর্ণসংখ্যার অংশটি ব্যবহার করে বা অ্যাক্সেস করতে পারে (সুতরাং অপারেশনের সময় যে কোনও সময় ডাবলের সাথে তুলনা করা যায় না) এবং ফলাফলটি হুবহু (বা কার্যত সমতুল্য, অ-সংখ্যাগত ফলাফলের ক্ষেত্রে যেমন NaN) যেন সংশ্লিষ্ট গাণিতিক অপারেশনটি সরাসরি doubleপরিবর্তে প্রয়োগ করা হয়েছিল ।

আপনি কোন পূর্ণসংখ্যার অংশটি ম্যানিপুলেট করতে পারেন তা বেছে নিতে পারেন, এমনকি বিভিন্ন অপারেটরের মধ্যেও বিভিন্ন ব্যবহার করতে পারেন। (আপনি ইউনিয়নের যে কোনও একটি ক্ষেত্র থেকে "স্বাক্ষরিত" অপসারণ করতেও বেছে নিতে পারেন, যদিও আপনি এটি করতে চান কিনা তা আমি নিশ্চিত নই।)

আপনার স্কোর চারটি অপারেটরের প্রত্যেকটির জন্য অক্ষরের কোড দৈর্ঘ্যের যোগফল। সর্বনিম্ন স্কোর জয়।

আমরা যারা আইইইই 754 নির্দিষ্টকরণের সাথে অপরিচিত তাদের জন্য, উইকিপিডিয়ায় এটি সম্পর্কে একটি নিবন্ধ এখানে


সম্পাদনা:

03-06 08:47 ইন্টফ্লোট স্ট্রাক্টে কনস্ট্রাক্টর যুক্ত করা হয়েছে। ম্যানুয়ালি ডাবল / ইত্যাদি সেট করার পরিবর্তে আপনি এগুলি পরীক্ষার জন্য ব্যবহার করতে পারবেন


1
বাবা! আমাকে বলুন আপনার একটি সমাধান আছে।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

4
হুমমম ... সম্ভবত এটি ভাল হবে সংজ্ঞায়িত করতে intstructপরিপ্রেক্ষিতে uint8_8, uint16_tএবং তাই পরম মাপ হিসাবে short, intএবং তাই মান দ্বারা সংজ্ঞায়িত না হয় (প্রতিটি টাইপ একটি সর্বনিম্ন আকার এবং সেখানে আকার কঠোর ক্রম, কিন্তু এটাই).
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

1
আমি অনুমান করি যে এটি একটি দুর্দান্ত (এবং চ্যালেঞ্জিং) অনুশীলন এমনকি অসম্পূর্ণ হলেও
জন ডিভোরাক

3
এই প্রশ্নটি কীভাবে গোল করা হয় এবং একটি ভাল পরীক্ষার স্যুট ডকুমেন্টেশন ব্যবহার করতে পারে।
পিটার টেলর

4
আমি নিশ্চিত এটি চশমাটিতে রয়েছে তবে আসল অনুমানটি কয়েক শ ডলারে ব্যয় হতে চলেছে। সম্ভবত এমন বর্ণনা রয়েছে যা নিখরচায় পাওয়া যায়, তবে এই ধরণের বিশদ (বা কমপক্ষে কোনও সাইটের লিঙ্ক যা সম্ভবত কয়েক বছর পরেও সম্ভবত রয়েছে) অন্তর্ভুক্ত করার জন্য প্রশ্নোত্তরকারীদের আইএমও এর উচিত should প্রশ্নটি আসলে কী চায় তা জানার জন্য উত্তরদাতাদের প্রয়োজনীয় উপকরণগুলি অনুসন্ধান করার পরিবর্তে প্রশ্ন করা উচিত
পিটার টেলর

উত্তর:


11

সি ++, 00 1500 অক্ষর

ভাসমানগুলি 8000-বাইনারি-অঙ্কের নির্দিষ্ট-পয়েন্ট উপস্থাপনায় প্রসারিত করে, তার উপর ক্রিয়াকলাপগুলি করে, তারপরে ফিরে রূপান্তরিত করে।

// an "expanded" float.                                                                                                         
// n is nan, i is infinity, z is zero, s is sign.                                                                               
// nan overrides inf, inf overrides zero, zero overrides digits.                                                                
// sign is valid unless nan.                                                                                                    
// We store the number in fixed-point, little-endian.  Binary point is                                                          
// at N/2.  So 1.0 is N/2 zeros, one, N/2-1 zeros.                                                                              
#define N 8000
struct E {
  int n;
  int i;
  int z;
  long s;
  long d[N];
};
#define V if(r.n|r.i|r.z)return r
// Converts a regular floating-point number to an expanded one.                                                                 
E R(F x){
  long i,e=x.k<<1>>53,m=x.k<<12>>12;
  E r={e==2047&&m!=0,e==2047,e+m==0,x.k>>63};
  if(e)m+=1L<<52;else e++;
  for(i=0;i<53;i++)r.d[2925+e+i]=m>>i&1;
  return r;
}
E A(E x,E y){
  int i,c,v;
  if(x.s>y.s)return A(y,x);
  E r={x.n|y.n|x.i&y.i&(x.s^y.s),x.i|y.i,x.z&y.z,x.i&x.s|y.i&y.s|~x.i&~y.i&x.s&y.s};V;
  if(x.s^y.s){
    c=0;
    r.z=1;
    for(i=0;i<N;i++){
      v=x.d[i]-y.d[i]-c;
      r.d[i]=v&1;c=v<0;
      r.z&=~v&1;
    }
    if(c){x.s=1;y.s=0;r=A(y,x);r.s=1;}
  }else{
    c=0;
    for(i=0;i<N;i++){
      v=x.d[i]+y.d[i]+c;
      r.d[i]=v&1;c=v>1;
    }
  }
  return r;
}
E M(E x, E y){
  int i;
  E r={x.n|y.n|x.i&y.z|x.z&y.i,x.i|y.i,x.z|y.z,x.s^y.s};V;
  E s={0,0,1};
  for(i=0;i<6000;i++)y.d[i]=y.d[i+2000];
  for(i=0;i<4000;i++){
    if(x.d[i+2000])s=A(s,y);
    y=A(y,y);
  }
  s.s^=x.s;
  return s;
}
// 1/d using Newton-Raphson:                                                                                                    
// x <- x * (2 - d*x)                                                                                                           
E I(E d){
  int i;
  E r={d.n,d.z,d.i,d.s};V;
  E t={};t.d[4001]=1;
  for(i=N-1;i>0;i--)if(d.d[i])break;
  E x={0,0,0,d.s};x.d[N-i]=1;
  d.s^=1;
  for(i=0;i<10;i++)x=M(x,A(t,M(d,x)));
  return x;
}
// Convert expanded number back to regular floating point.                                                                      
F C(E x){
  long i,j,e,m=0;
  for(i=N-1;i>=0;i--)if(x.d[i])break;
  for(j=0;j<N;j++)if(x.d[j])break;
  if(i>0&x.d[i-53]&(j<i-53|x.d[i-52])){E y={0,0,0,x.s};y.d[i-53]=1;return C(A(x,y));}
  if(i<2978){e=0;for(j=0;j<52;j++)m+=x.d[j+2926]<<j;}
  else if(i<5024){e=i-2977;for(j=0;j<52;j++)m+=x.d[i+j-52]<<j;}
  else x.i=1;
  if(x.z)e=m=0;
  if(x.i){e=2047;m=0;}
  if(x.n)e=m=2047;
  F y;y.k=x.s<<63|e<<52|m;return y;
}
// expand, do op, unexpand                                                                                                      
F A(F x,F y){return C(A(R(x),R(y)));}
F S(F x,F y){y.k^=1L<<63;return A(x,y);}
F M(F x,F y){return C(M(R(x),R(y)));}
F D(F x,F y){return C(M(R(x),I(R(y))));}

সঠিক গল্ফযুক্ত গণনা পেতে আমি সমস্ত স্থান এবং নিউলাইনগুলি সরিয়ে দিতে খুব অলস, তবে এটি প্রায় 1500 অক্ষর।

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