ভাসমান পয়েন্ট সংখ্যাটি দশমিক হিসাবে ঠিক বিন্যাস করুন


9

যে কোনও বাইনারি ভাসমান পয়েন্ট দশমিক ঠিক হ'ল বিন্যাস করা যায়। ফলস্বরূপ স্ট্রিং কিছুটা দীর্ঘ হতে পারে, তবে এটি সম্ভব। ইন ফ্লোটিং পয়েন্ট উপর আমার প্রবন্ধে আমি স্পষ্টতা গুরুত্ব আবরণ, এবং এখন আমি এই ফাংশন চাই। এই চ্যালেঞ্জটি হ'ল একটি প্রোগ্রাম বা ফাংশন লিখুন যা ইনপুট হিসাবে একটি ভাসমান পয়েন্ট মান নেয় এবং আউটপুট হিসাবে একটি নির্দিষ্ট দশমিক স্ট্রিং বিন্যাস করে।

আমরা সঠিক ভাসমান পয়েন্ট সংখ্যাগুলির সাথে কাজ করছি তা নিশ্চিত করার জন্য অবশ্যই প্রোগ্রামের ইনপুট হিসাবে একটি সুনির্দিষ্ট বিন্যাস সরবরাহ করতে হবে। এই ফর্ম্যাটটি দুটি পূর্ণসংখ্যার হবে Significand Exponent, যেখানে আসল ভাসমান পয়েন্টের মান Significand * 2 ^ Exponent। নোট করুন যে কোনওটি মান negativeণাত্মক হতে পারে।

সুনির্দিষ্ট:

  • কমপক্ষে একটি 32-বিট ফ্লোটের পরিসর এবং যথার্থতা অবশ্যই সমর্থন করা উচিত (কোনও ইনপুট এর বাইরে যাবে না)
  • দশমিক বিন্যাসিত মানটি অবশ্যই একটি যথাযথ উপস্থাপনা হতে পারে (ভাসতে ফিরে সঠিক রাউন্ড-টিপ গ্যারান্টির জন্য যথেষ্ট পরিমাণে যথেষ্ট ভাল নয়)
  • পর্যাপ্ত সঠিক বা দ্রুত পর্যাপ্ত (প্রাক্তন printf:) হতে আমরা স্ট্যান্ডার্ড লাইব্রেরি ফ্লোটিং পয়েন্ট ফর্ম্যাটিং ফাংশনগুলিকে বিশ্বাস করি না এবং সুতরাং সেগুলি ব্যবহার নাও করা যেতে পারে। আপনাকে অবশ্যই ফর্ম্যাটিং করতে হবে। ইন্টিগ্রাল ফর্ম্যাটিং / রূপান্তর ফাংশন অনুমোদিত।
  • সামনে .কোনও সংখ্যার উপাদান না থাকলে প্রয়োজনীয় অগ্রণী শূন্য ব্যতীত কোনও শীর্ষস্থানীয় বা পিছনে জিরো নাও থাকতে পারে
  • একটি ফাংশন, বা পুরো প্রোগ্রাম অনুমোদিত,

উদাহরণ:

1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64

সংক্ষিপ্ততম কোড জিতেছে।


3
সীমাহীন নির্ভুলতা ভাসমান পয়েন্ট গাণিতিক ব্যবহার অনুমোদিত?
ডেনিস

2
যদি ঘাঁটিঘটিত হয় না, তবে আমরা কি শেষ করতে পারি .0?
Sp3000

@ ডেনিস: হ্যাঁ, সীমাহীন বা উচ্চ স্থির নির্ভুলতা পাটিগণিত অনুমোদিত।
এডিএ-কিএ মার্ট-ওরা-ই

1
আমি মনে করি এটি বেমানান। যদি 0.abcঅগ্রণী শূন্য না হয়, তবে abc.0এটি কোনও অনুসরণযোগ্য নয়।
orlp

1
.0ভাসমান পয়েন্ট সংখ্যার সাথে ডিল করার সময় পুরো সংখ্যাটি সর্বদা শেষ করার জন্য এটিও কনভেনশন । উদাহরণস্বরূপ পাইথন দেখুন: str(1.0) == '1.0'বনাম str(1) == '1'। আপনার যুক্তি এখনও বেমানান।
orlp

উত্তর:


3

সিজেম, 43

r_'-&\ize999rim<s1e3'0e[W%999/(i_L?\+'.*sW%

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

ব্যাখ্যা:

ডাবল যথার্থতা (bit৪ বিট) এর কাছাকাছি করে প্রোগ্রামটি ± 999 পর্যন্ত এক্সপোজারগুলির সাথে কাজ করে। এটি মাইনাস চিহ্নটি (যদি উপস্থিত থাকে) তা ম্যিনেট্যান্ড থেকে পৃথক করে, এটি 10 999 দিয়ে গুণ করে তারপরে এক্সপেন্ডারের সাথে কিছুটা শিফট করে, যা এখন একটি সঠিক গণনা। এরপরে জিরো দিয়ে বামে প্যাড করা হয় যদি ফলাফলের 1000 টিরও কম অঙ্ক থাকে তবে শেষ 999 সংখ্যাটিকে ভগ্নাংশ হিসাবে পৃথক করে, তার বিপরীতটিকে পূর্ণসংখ্যায় রূপান্তর করে ট্রেলিং শূন্যগুলি সরিয়ে দেয়, প্রয়োজনে দশমিক পয়েন্ট যুক্ত করে এবং সবকিছুকে একসাথে রেখে দেয়।

r_         read and duplicate the significand in string form
'-&        keep only the minus sign, if present
\          swap with the other copy of the significand
iz         convert to integer and get absolute value
e999       multiply by 10^999
ri         read the exponent and convert to integer
m<         shift left by it; negative values will shift right
            the result is an exact non-negative integer
s          convert to string
1e3'0e[    pad to the left with zero characters up to length 1000
            longer strings will be left intact
            we need 1 more than 999 for the 0.xxx case
W%         reverse the string
999/       split into slices of length 999
(          take out the first slice (reversed fractional part)
i          convert to integer
            this removes the leading zeros (trailing in reverse)
_L?        if it's zero, replace with an empty string
\+         concatenate back (to the left) with the second slice
'.*        join the with the dot character
            if the fractional part was zero, we only have the second slice
            (reversed integer part) and there is nothing to join
s          convert to string; this is the reversed result without the sign
W%         reverse back

শেষে, বিয়োগ চিহ্ন (যদি থাকে) এবং চূড়ান্ত স্ট্রিং স্বয়ংক্রিয়ভাবে একসাথে মুদ্রিত হয়।


2

সিজেম, 50 বাইট

q~A1$z#\_0>K5?\z:E#@_s'-&oz*\md_sE'0e[W%isW%'.\+Q?

এটি একটি সম্পূর্ণ প্রোগ্রাম যা এসটিডিএন থেকে পড়ে। সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

একবারে সমস্ত পরীক্ষার কেস যাচাই করুন।


আপনার মন্তব্যের ভিত্তিতে আমি ধরে নিয়েছি সিজেমের সীমাহীন নির্ভুলতা রয়েছে এবং আপনি এটি এখানে ব্যবহার করেছেন? তাহলে কি ঠিক আছে যে এই উত্তরটি কোনও ইনপুট কভার করে, কেবল 32-বিট ফ্লোট নয়? এছাড়াও, আমরা কীভাবে এটি কাজ করে তার একটি ব্যাখ্যা পেতে পারি?
এডিএ-কিএ মার্ট-ওরা-ই

সিজামের পূর্ণসংখ্যার জন্য সীমাহীন নির্ভুলতা রয়েছে তবে কেবলমাত্র ডাবল নির্ভুলতা ভাসমান। আমি ধনাত্মক উদ্দীপকগুলির জন্য 20 এর শক্তি এবং নেতিবাচক ব্যক্তির জন্য 5 পাওয়ার দ্বারা গুণ করি, ডটকে স্ট্রিং করতে এবং sertোকাতে। আমি কয়েক ঘন্টার মধ্যে একটি বিস্তারিত ব্যাখ্যা যুক্ত করব।
ডেনিস

এবং হ্যাঁ, যথেষ্ট মেমরি দেওয়া, এটি কোনও ইনপুটটির জন্য কাজ করা উচিত।
ডেনিস

10 -2 মনে হচ্ছে একটি পেছনের শূন্য রয়েছে
অ্যাডিটসু প্রস্থান করুন কারণ SE ইভিল

@ অ্যাডিতু: হ্যাঁ হ্যাঁ, 2 এর প্রতিটি শক্তির জন্য শূন্যের পিছনে একটি ...
ডেনিস

2

জিএনইউ সেড + ডিসি, 65

স্কোরটিতে সেডের -rবিকল্পের জন্য +1 অন্তর্ভুক্ত রয়েছে ।

y/-/_/
s/.*/dc -e"C8k& 2r^*p"/e
s/\\\n//
s/0+$//
s/^(-?)\./\10./

আমি 10 স্কোরের জন্য এই dcএকমাত্র উত্তর দাবি করতে প্রলুব্ধ হয়েছিলাম C8k& 2r^*p, তবে dcকিছু ফর্ম্যাটিং প্রশ্ন রয়েছে:

  • এর _পরিবর্তে- সাইন চিহ্নটি-
  • দীর্ঘ লাইনগুলি ব্যাকস্ল্যাশগুলির সাথে ভেঙে গেছে
  • চলমান শূন্যগুলি অবশ্যই অপসারণ করতে হবে
  • নেতৃস্থানীয় 0 |n| < 1যোগ করা আবশ্যক

সুতরাং sedউপরের যত্ন নেওয়ার জন্য ডিসি এক্সপ্রেশনটি মোড়ানো এবং স্পষ্ট করা হয়েছে।

পরীক্ষার আউটপুট:

$ echo "1 -2
17 -3
-123 11
17 50
23 -13
3 120
3 -50
-3 -50
8388608 127
1 -127" | sed -rf float.sed
0.25
2.125
-251904
19140298416324608
0.0028076171875
3987683987354747618711421180841033728
0.00000000000000266453525910037569701671600341796875
-0.00000000000000266453525910037569701671600341796875
1427247692705959881058285969449495136382746624
0.0000000000000000000000000000000000000058774717541114375398436826861112283890933277838604376075437585313920862972736358642578125
$ 

হুম, আমি ভাবছি dcof ধরণের স্ট্যান্ডার্ড ফর্ম্যাটিং ফাংশনটি ব্যবহার করে আমার নিয়ম লঙ্ঘন করে।
এডিএ-কিএ মার্ট-ওরা-ই

1
@ edA-qamort-ora-y আমি বুঝতে পেরেছি যে "সীমাহীন বা উচ্চ স্থির নির্ভুলতা পাটিগণিত অনুমোদিত"dc দেওয়া সত্ত্বেও এর ব্যবহার ঠিক । এর কমান্ড একটি "নয় ভাসমান ফাংশন বিন্যাস নির্দেশ" - এটা একটি অবাধ স্পষ্টতা মুদ্রণ ফাংশন। আমি স্পষ্টতাটি 128 দশমিক স্থানে স্থাপন করছি ( ), যা আমি মনে করি যে কোনও 32 বিট ফ্লোটের জন্য যথেষ্ট পরিমাণে বেশি। dcpC8k
ডিজিটাল ট্রমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.