ডাবল বেস


12

পটভূমি

আইইইই 754 ডাবল-স্পষ্টতা ফ্লোটিং-পয়েন্ট ফর্ম্যাট 64৪ বিট সহ বাস্তব সংখ্যা উপস্থাপন করার একটি উপায়। এটি নীচের মত দেখাচ্ছে:

একটি আসল সংখ্যা নিম্নলিখিত পদ্ধতিতে nএকটিতে রূপান্তরিত হয় double:

  1. sসংখ্যাটি ইতিবাচক হলে সাইন বিট 0 হয়, অন্যথায় 1।
  2. পরম মান nআকারে প্রতিনিধিত্ব করা হয় 2**y * 1.xxx, একটি অর্থাৎ ক্ষমতা-অফ-2 বার বেস
  3. এক্সপোনেন্ট eহয় y(2 এর ক্ষমতা) বিয়োগ 1023।
  4. ভগ্নাংশটি fহ'ল xxxঅংশ (বেসের ভগ্নাংশ), সর্বাধিক উল্লেখযোগ্য 52 বিট গ্রহণ করে taking

বিপরীতভাবে, একটি বিট প্যাটার্ন (চিহ্ন দ্বারা চিহ্নিত s, ঘনিষ্ঠ eএবং ভগ্নাংশ f, প্রতিটি একটি পূর্ণসংখ্যার) সংখ্যাটি উপস্থাপন করে:

(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))

চ্যালেঞ্জ

একটি আসল সংখ্যা দেওয়া হয়েছে n, এটি পূর্ণসংখ্যার হিসাবে doubleউপস্থাপনার 52-বিট ভগ্নাংশ অংশ আউটপুট করুন n

পরীক্ষার কেস

0.0        =>                0
1.2        =>  900719925474099 (hex 3333333333333)
3.1        => 2476979795053773 (hex 8cccccccccccd)
3.5        => 3377699720527872 (hex c000000000000)
10.0       => 1125899906842624 (hex 4000000000000)
1234567.0  =>  798825262350336 (hex 2d68700000000)
1e-256     => 2258570371166019 (hex 8062864ac6f43)
1e+256     => 1495187628212028 (hex 54fdd7f73bf3c)

-0.0       =>                0
-1.2       =>  900719925474099 (hex 3333333333333)
-3.1       => 2476979795053773 (hex 8cccccccccccd)
-3.5       => 3377699720527872 (hex c000000000000)
-10.0      => 1125899906842624 (hex 4000000000000)
-1234567.0 =>  798825262350336 (hex 2d68700000000)
-1e-256    => 2258570371166019 (hex 8062864ac6f43)
-1e+256    => 1495187628212028 (hex 54fdd7f73bf3c)

আপনি এই সি রেফারেন্সটি ব্যবহার করে অন্যান্য নম্বর পরীক্ষা করতে পারেন যা বিট ক্ষেত্র এবং ইউনিয়ন ব্যবহার করে।

মনে রাখবেন যে প্রত্যাশিত উত্তরটি কোনও সংখ্যার জন্য +nএবং একই রকম ।-nn

ইনপুট এবং আউটপুট

স্ট্যান্ডার্ড বিধি প্রয়োগ।

স্বীকৃত ইনপুট ফর্ম্যাট:

  • অন্তত doubleঅভ্যন্তরে অন্তত নির্ভুলতা থাকা একটি ভাসমান-পয়েন্ট নম্বর
  • দশমিক সংখ্যার একটি স্ট্রিং প্রতিনিধিত্ব (আপনি বৈজ্ঞানিক স্বরলিপি সমর্থন করার প্রয়োজন নেই, যেহেতু আপনি ব্যবহার করতে পারেন 1000...00বা 0.0000...01ইনপুট হিসাবে)

আউটপুট জন্য, কমপক্ষে উল্লেখযোগ্য বিট এ একটি বৃত্তাকার ত্রুটি সহনীয়।

জয়ের শর্ত

এটি , তাই প্রতিটি ভাষার মধ্যে সর্বনিম্ন বাইটগুলি জয়ী হয়।



1
পরীক্ষার ক্ষেত্রে কেবল অ-নেতিবাচক সংখ্যা অন্তর্ভুক্ত থাকে। ইনপুট কি নেতিবাচক হতে পারে?
ডেনিস

@ ডেনিস হ্যাঁ আমি আরও কিছু পরীক্ষার কেস যুক্ত করব।
বুবলার

3
আইইইই ভাসমান বিন্দু বিন্যাসের আপনার বিবরণে ডেনরমাল সংখ্যার উল্লেখ নেই যা কিছুটা আলাদা উপায়ে ব্যাখ্যা করা হয় (কোনও অন্তর্নিহিত শীর্ষস্থানীয় 1)। ডেনারমালগুলি কী সঠিকভাবে পরিচালনা করতে হবে?
নলহ্নহফ

1
@ ননহ্নহফ আপনাকে ডেনারমালস, এনএএন এবং ইনফিনিটি বিবেচনা করার দরকার নেই।
বুবলার

উত্তর:


8

সি (জিসিসি) , 42 30 বাইট

long f(long*p){p=*p&~0UL>>12;}

লাগে একটি একটি পয়েন্টার ডবল আর্গুমেন্ট হিসাবে এবং একটি ফেরৎ দীর্ঘ

64৪-বিট দীর্ঘ এবং জিসিসি (অপরিজ্ঞাত আচরণ) প্রয়োজন behavior

-২ বাইটের জন্য @ ননহ্নহোফকে ধন্যবাদ!

এটি অনলাইন চেষ্টা করুন!


&~0UL>>12দুটি বাইট সংক্ষিপ্ত। যদিও ম্যাক্রো কেবল ল্যাভেলুয়েসগুলির সাথে কাজ করে।
nwellnhof

ম্যাক্রো ব্যবহার করুন -Df(x)=*(long *)&x&~0UL>>12, 3 বাইট সংরক্ষণ করুন । টিআইও
জিপিএস 18

6

হাস্কেল, 27 31 বাইট

(`mod`2^52).abs.fst.decodeFloat

decodeFloatতাত্পর্য এবং ঘনিষ্ঠটিকে ফেরত দেয় তবে কোনও কারণে হাসকেলের মধ্যে পূর্ববর্তীটি 53 বিট , সুতরাং আমাদের একটি বিট কাটাতে হবে।

এটি অনলাইন চেষ্টা করুন!


5

পাইথন 3 , 54 50 বাইট

f=lambda x:int(x.hex().split('.')[1].split('p')[0],16)

এটি অনলাইন চেষ্টা করুন!

কিরিলের পরামর্শ সহ:

f=lambda x:int(x.hex()[4+(x<0):].split('p')[0],16)

এটি অনলাইন চেষ্টা করুন!


আমি ভুল হতে পারি, তবে আমি মনে করি পাইথনগুলি hex()সর্বদা শুরু হওয়া স্বাভাবিক সংকেত দেয় 0x1.। যদি তাই হয়, আপনি শুধু ব্যবহার করতে পারে এই 44 বাইট জন্য।
কিরিল এল।

1
ঠিক আছে, আমি নেতিবাচক সংখ্যাগুলি সম্পর্কে ভুলে গেছি, সুতরাং এটি সর্বোপরি 50 বাইটের মতো দেখাচ্ছে ।
ক্যারিল এল

@ কিরিল-এল এটি সর্বদা "১" দিয়ে শুরু হয় না (উদাহরণস্বরূপ (2 ** - 1028) দেখুন) তবে ওপি সাবর্মরমালগুলি সম্পর্কে কিছুই বলে না, তাই আমার ধারণা আপনার দ্বিতীয় পরামর্শ গ্রহণযোগ্য। সম্পাদনা করতে নির্দ্বিধায় দয়া করে।
লুকা সিটি

প্রকৃতপক্ষে একটি সাম্প্রতিক মন্তব্যে ওপি স্পষ্টভাবে বলেছে যে আমরা নিরাপদে সাবমনোরমগুলিকে উপেক্ষা করতে পারি।
লুকা সিটি

5

লিনাক্সের জন্য x86_64 মেশিনের ভাষা, 14 বাইট

0:       66 48 0f 7e c0          movq   %xmm0,%rax
5:       48 c1 e0 0c             shl    $0xc,%rax
9:       48 c1 e8 0c             shr    $0xc,%rax
d:       c3                      retq

এটি অনলাইন চেষ্টা করুন!


স্ট্যান্ডার্ড এবিআইয়ের পরিবর্তে আপনার নিজের সিসি ব্যবহার করে দেখুন। দ্বিগুণ র‌্যাক্সে থাকা প্রয়োজনের মাধ্যমে আপনি এক্সএমএম 0 থেকে সহজেই পুরো চালটি ফেলে দিতে পারেন। এর জন্য কেবলমাত্র পরিবর্তনের প্রয়োজন সি এর চেয়ে এএসএম পরীক্ষার কাঠামো তৈরি করা (যদি না জিসিসি অতিরিক্ত স্মার্ট হয়)।
moonheart08


4

জাভাস্ক্রিপ্ট (ES7), 52 50 বাইট

f=n=>n?n<0?f(-n):n<1?f(n*2):n<2?--n*2**52:f(n/2):0
<input oninput=o.textContent=f(this.value)><pre id=o>0

ব্যবহার Math.floor(Math.log2(n))করা হচ্ছে না কারণ এটি সঠিক হওয়ার গ্যারান্টিযুক্ত নয়। সম্পাদনা: @ ড্যানিয়েল ইন্ডিকে ধন্যবাদ 2 বাট সংরক্ষিত


কেন
এন

@ ড্যানিয়েল ইন্ডি কারণ আমি ভুলে গেছি যে গল্ফটি ভাসমানদের সাথে কাজ করে ...
নীল


2

সি (জিসিসি) ম্যাক্রো, 49 বাইট

-DF(x)=x?ldexp(frexp(fabs(x),(int[1]){})-.5,53):0

এটি অনলাইন চেষ্টা করুন!

doubleআইইইইই নির্ভুলতা ধরে নিয়ে তবে ফিরে আসে , এতে ভগ্নাংশের অংশ থাকবে না। এছাড়াও এখন নেতিবাচক সংখ্যা পরিচালনা করে।



2

হুন , 25 বাইট

|*(* (mod +< (pow 2 52)))

একটি জেনেরিক ফাংশন তৈরি করুন যা ইনপুট মোডটি দেয় 2^52

এটিকে কল করা:

> %.  .~1e256
  |*(* (mod +< (pow 2 52)))
1.495.187.628.212.028

আমি কখনই ভাবিনি যে এখানে আমি হুন দেখতে পাব। কয়েক বছর আগে আমি ইউরবিটটি বোঝার চেষ্টা করেছি, তবে সত্যিই এর মাথা বা লেজ তৈরি করতে পারিনি couldn't
পুনরাবৃত্তির

2

জাভাস্ক্রিপ্ট (ES7), 98 76 বাইট

22 (!) বাইটস সংরক্ষিত @ নীলকে ধন্যবাদ

নীলের উত্তরের চেয়ে আরও ভার্বোস , তবে আমি টাইপ করা অ্যারে দিয়ে চেষ্টা করে দেখতে চাই

(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l

এটি অনলাইন চেষ্টা করুন!


ES7 + UInt32Array22 বাইট সংরক্ষণ করে:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
নীল

এমন কোন দোভাষী আছে যা BigInt64Arrayইতিমধ্যে বাস্তবায়ন করেছিল ?
tsh


1

স্ট্যাক্স , 19 14 বাইট

üâïc-Hò~÷]ó┬ó♪

এটি চালান এবং এটি ডিবাগ করুন

আনপ্যাকড, অবরুদ্ধ এবং মন্তব্য করা হয়েছে, কোডটি দেখতে এমন দেখাচ্ছে।

|a      absolute value
{HcDw   double until there's no fractional part
@       convert to integer type
:B      convert to binary digits
D52(    drop the first digit, then pad to 52
:b      convert back number

এটি চালান





0

লিনাক্সের জন্য আর্চ 64 মেশিনের ভাষা, 12 বাইট

0:   9e660000        fmov x0, d0
4:   9240cc00        and  x0, x0, #0xfffffffffffff
8:   d65f03c0        ret

এটি ব্যবহার করে দেখতে, কোনও আর্চ Linux৪ লিনাক্স মেশিনে বা (আর্চ )৪) অ্যান্ড্রয়েড ডিভাইস টার্মাক্সে চলমান নিম্নলিখিত সি প্রোগ্রামটি সংকলন এবং চালনা করুন

#include<stdio.h>
const char f[]="\0\0f\x9e\0\xcc@\x92\xc0\3_\xd6";
int main(){
  double io[] = { 0.0,
                  1.2,
                  3.1,
                  3.5,
                 10.0,
            1234567.0,
               1e-256,
               1e+256,
                 -0.0,
                 -1.2,
                 -3.1,
                 -3.5,
                -10.0,
           -1234567.0,
              -1e-256,
              -1e+256 };

  for (int i = 0; i < sizeof io / sizeof*io; i++) {
    double input = io[i];
    long output = ((long(*)(double))f)(io[i]);

    printf("%-8.7g => %16lu (hex %1$013lx)\n", input, output);
  }
}


0

ফোর্থ (গফার্থ) , 42 বাইট

ধরে নিন ডিফল্টরূপে ভাসমানগুলি দ্বিগুণ এবং কোষগুলি 8 বাইট দৈর্ঘ্য (যেমনটি আমার কম্পিউটার এবং টিআইওর ক্ষেত্রে রয়েছে)

: f f, here float - @ $fffffffffffff and ;

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

f,             \ take the top of the floating point stack and store it in memory
here float -   \ subtract the size of a float from the top of the dictionary
@              \ grab the value at the address calculated above and stick it on the stack
$fffffffffffff \ place the bitmask (equivalent to 52 1's in binary) on the stack
and            \ apply the bitmask to discard the first 12 bits

ফোর্থ (গফার্থ) 4-বাইট সেল উত্তর, 40 বাইট

পরিবর্তে কিছু পুরানো ইনস্টলেশন 4-বাইট কোষগুলিতে ডিফল্ট হয়

: f f, here float - 2@ swap $FFFFF and ;

ব্যাখ্যা

f,             \ take the top of the floating point stack and store it in memory
here float -   \ subtract the size of a float from the top of the dictionary
2@             \ grab the value at the address above and put it in the top two stack cells
swap           \ swap the top two cells put the number in double-cell order
$fffff         \ place the bitmask (equivalent to 20 1's in binary) on the stack
and            \ apply the bitmask to discard the first 12 bits of the higher-order cell
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.