সি-তে স্বাক্ষরবিহীন ফ্লোটস কেন নেই?


131

আমি জানি, প্রশ্নটি অদ্ভুত বলে মনে হচ্ছে। প্রোগ্রামাররা মাঝে মাঝে অনেক বেশি ভাবেন। দয়া করে পড়ুন ...

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

আমি এই সতর্কতা পছন্দ। তারা আমার কোডটি সঠিক রাখতে সহায়তা করে।

ভাসমানদের জন্য আমাদের কেন একই বিলাসিতা নেই? স্কোয়ার-রুট অবশ্যই কখনও নেতিবাচক সংখ্যাকে ফেরত দেবে না। পাশাপাশি অন্যান্য জায়গা রয়েছে যেখানে নেতিবাচক ফ্লোট মানটির কোনও অর্থ নেই has স্বাক্ষরবিহীন ফ্লোটের জন্য নিখুঁত প্রার্থী।

বিটিডব্লিউ - আমি একমাত্র অতিরিক্ত বিট স্পষ্টতা সম্পর্কে আগ্রহী নই যা আমি ভাসমানগুলি থেকে সাইন বিটটি সরিয়ে দিয়ে পেতে পারি। floatতারা এখন যেমন আছে তেমন আমি খুব খুশি । আমি মাঝে মাঝে স্বাক্ষরযুক্ত হিসাবে একটি ফ্লোট চিহ্নিত করতে এবং পূর্ণসংখ্যার সাথে একই ধরণের সতর্কতা পেতে চাই।

আমি এমন কোনও প্রোগ্রামিং ভাষা সম্পর্কে অবগত নই যা স্বাক্ষরবিহীন ভাসমান-পয়েন্ট সংখ্যাগুলিকে সমর্থন করে।

কোন ধারণা কেন তাদের অস্তিত্ব নেই?


সম্পাদনা করুন:

আমি জানি যে x87 এফপিইউতে স্বাক্ষরবিহীন ফ্লোটগুলি মোকাবেলার জন্য কোনও নির্দেশনা নেই। কেবলমাত্র স্বাক্ষরিত ফ্লোট নির্দেশাবলী ব্যবহার করতে দিন। অপব্যবহার (উদাহরণস্বরূপ শূন্যের নীচে চলে যাওয়া) একইভাবে অপরিজ্ঞাত আচরণ হিসাবে বিবেচিত হতে পারে যেমন স্বাক্ষরিত পূর্ণসংখ্যার ওভারফ্লো অপরিজ্ঞাত হয়।


4
আকর্ষণীয়, আপনি কি এমন একটি ক্ষেত্রে পোস্ট করতে পারেন যেখানে সাইননেস টাইপচেকিং সহায়ক ছিল?

লিটব, আপনার মন্তব্য আমার প্রতি নির্দেশিত ছিল? যদি তা হয় তবে আমি তা পাই না

ইরামিলিঞ্জা হ্যাঁ :) কল্পিত লোকগুলি নেতিবাচক সংখ্যাটি ফিরতে পারে না, কারণ এটি তার যুক্তির নিখুঁত মানটি
ফেরায়

রাইট.আই জিজ্ঞাসা করতে পারেনি যে একটি অনুমানমূলক স্বাক্ষরবিহীন ফ্লোট কীভাবে কর্ট্যাকনেসকে সহায়তা করতে পারে i আমি যা জিজ্ঞাসা করেছি: কোন পরিস্থিতিতে পিপেনব্রিন্ক ইনট স্বাক্ষর টাইপচেকিংকে সহায়ক বলে খুঁজে পেয়েছিল (তাকে ভাসমানদের জন্য একই পদ্ধতিতে সন্ধান করতে পরিচালিত করেছে) আমি জিজ্ঞাসা করার কারণটি হ'ল আমি স্বাক্ষর করা সম্পূর্ণরূপে অকেজো পাই

1
পয়েন্ট-ইন-রেঞ্জ চেকের জন্য একটি স্বাক্ষরবিহীন মাইক্রো-অপ্টিমাইজেশন রয়েছে: ((স্বাক্ষরযুক্ত) (পি-মিনিট)) <(সর্বোচ্চ-মিনিট), যার কেবল একটি শাখা রয়েছে, তবে, সর্বদা হিসাবে, এটি প্রোফাইল হিসাবে দেখা ভাল কিনা এটি সত্যই সহায়তা করে (আমি বেশিরভাগ ক্ষেত্রে এটি 386 কোরে ব্যবহার করেছি যাতে আমি জানি না কীভাবে আধুনিক সিপিইউগুলি মোকাবেলা করে)।
স্কিজে

উত্তর:


114

সি ++ এর কেন স্বাক্ষরবিহীন ফ্লোটগুলির জন্য সমর্থন নেই কারণ সিপিইউ কার্যকর করার জন্য কোনও সমতুল্য মেশিন কোড অপারেশন নেই। সুতরাং এটি সমর্থন করা খুব অদক্ষ হবে।

যদি সি ++ এটি সমর্থন করে তবে আপনি কখনও কখনও স্বাক্ষরবিহীন ফ্লোট ব্যবহার করছেন এবং বুঝতে পারছেন না যে আপনার অভিনয়টি সবেমাত্র নিহত হয়েছে killed যদি সি ++ এটি সমর্থন করে তবে প্রতিটি স্লোটিং পয়েন্ট অপারেশনটিতে এটি স্বাক্ষরিত আছে কিনা তা যাচাই করা দরকার। এবং লক্ষ লক্ষ ভাসমান পয়েন্ট অপারেশন করে এমন প্রোগ্রামগুলির জন্য, এটি গ্রহণযোগ্য নয়।

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

আপনি স্বাক্ষরিত ফ্লোটিং পয়েন্ট টাইপ না করেই পেতে পারেন যদিও স্বাক্ষরযুক্ত ফ্লোট ক্লাস তৈরি করে যা একটি ফ্লোটকে ডাবল করে দেয় বা ডাবল করে এবং সতর্কতা ছুড়ে দেয় যদি আপনি কোনও নেতিবাচক সংখ্যায় পাস করার চেষ্টা করেন। এটি কম দক্ষ, তবে সম্ভবত আপনি যদি এগুলিকে তীব্রভাবে ব্যবহার না করেন তবে আপনি যে সামান্য পারফরম্যান্স হারাবেন তার যত্ন নেবেন না।

আমি অবশ্যই স্বাক্ষরবিহীন ফ্লোট থাকার উপযোগিতাটি দেখতে পাচ্ছি। তবে সি / সি ++ এমন দক্ষতা বেছে নিয়েছে যা সুরক্ষার জন্য সবার পক্ষে সবচেয়ে ভাল কাজ করে।


17
ভাষা প্রয়োগের জন্য সি / সি ++ এর জন্য নির্দিষ্ট মেশিন কোড অপারেশনগুলির প্রয়োজন হয় না। প্রারম্ভিক সি / সি ++ সংকলকগুলি 386 এর জন্য ভাসমান পয়েন্ট কোড তৈরি করতে পারে - কোনও এফপিইউবিহীন সিপিইউ! সংকলক এফপিইউ নির্দেশাবলী অনুকরণ করার জন্য লাইব্রেরি কল উত্পন্ন করবে। অতএব, সিপিইউ সমর্থন ছাড়াই একটি উফ্লোট করা যেতে পারে
স্কিজে

10
স্কিজ, যদিও এটি সঠিক, ব্রায়ান ইতিমধ্যে এটিকে সম্বোধন করেছে - কারণ কোনও সমতুল্য মেশিন কোড নেই বলে তুলনা করে পারফরম্যান্সটি ভয়াবহ হবে।
অ্যান্টনি

2
@ ব্রায়ান আর বন্ডি: আমি আপনাকে এখানে হারিয়েছি: "কারণ সিপিইউ কার্যকর করার জন্য কোনও সমতুল্য মেশিন কোড অপারেশন নেই ..."। আপনি কি সহজ ভাষায় ব্যাখ্যা করতে পারেন?
লেজার

2
স্বাক্ষরবিহীন ফ্লোটের জন্য ওপি সমর্থন চাওয়ার কারণ হুশিয়ারি বার্তা ছিল, সুতরাং এটির সংকলকটির কোড জেনারেশন পর্বের সাথে আসলে কিছুই করার নেই - কেবল এটি কীভাবে আগে যাচাই করা হয়েছিল তা কীভাবে করা যায় - তাই মেশিন কোডে তাদের জন্য সমর্থন অপ্রাসঙ্গিক এবং (যেমন প্রশ্নের নীচে যুক্ত করা হয়েছে) স্বাভাবিক ভাসমান পয়েন্ট নির্দেশাবলী প্রকৃত বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে।
জো এফ

2
আমি নিশ্চিত নই যে আমি কেন এটির কার্য সম্পাদনকে প্রভাবিত করব। ঠিক intএকইভাবে, সমস্ত সাইন-সম্পর্কিত টাইপ-চেকিং সংকলন সময়ে ঘটতে পারে। ওপি পরামর্শ দেয় যে নির্দিষ্ট অ-অর্থপূর্ণ ক্রিয়াকলাপ কখনই সঞ্চালিত হয় না তা নিশ্চিত করার জন্য সংকলন-সময় পরীক্ষা সহ unsigned floatনিয়মিত হিসাবে প্রয়োগ করা হবে float। আপনার ভাসমান স্বাক্ষরিত কিনা তা নির্বিশেষে ফলস্বরূপ মেশিনের কোড এবং কার্য সম্পাদন অভিন্ন হতে পারে।
xenderflood

14

সি / সি ++ এ স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যার মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে:

value >> shift

স্বাক্ষরিত মানগুলি শীর্ষ বিটটি অপরিবর্তিত রেখে দেয় (সাইন প্রসারিত), স্বাক্ষরবিহীন মানগুলি শীর্ষ বিটটি সাফ করে।

স্বাক্ষরযুক্ত স্বাক্ষরিত না হওয়ার কারণটি হ'ল যদি কোনও নেতিবাচক মান না থাকে তবে আপনি দ্রুত সমস্ত ধরণের সমস্যার মধ্যে চলে যান। এই বিবেচনা:

float a = 2.0f, b = 10.0f, c;
c = a - b;

গ এর কোন মান আছে? -8। কিন্তু নেতিবাচক সংখ্যা ছাড়া একটি সিস্টেমে এর অর্থ কী। FLOAT_MAX - 8 সম্ভবত? প্রকৃতপক্ষে, এটি FLOAT_MAX হিসাবে কাজ করে না - 8 যথাযথ প্রভাবগুলির কারণে FLOAT_MAX হয় তাই জিনিসগুলি আরও চতুর। এটি যদি আরও জটিল অভিব্যক্তির অংশ হয়:

float a = 2.0f, b = 10.0f, c = 20.0f, d = 3.14159f, e;
e = (a - b) / d + c;

2 এর পরিপূরক সিস্টেমের প্রকৃতির কারণে এটি পূর্ণসংখ্যার জন্য কোনও সমস্যা নয়।

মানক গাণিতিক ফাংশনগুলিও বিবেচনা করুন: পাপ, কোস এবং ট্যান কেবলমাত্র তাদের ইনপুট মানগুলির অর্ধেকের জন্য কাজ করবে, আপনি <1 মানগুলির লগটি খুঁজে পেলেন না, আপনি চতুর্ভুজ সমীকরণগুলি সমাধান করতে পারেন না: x = (-বি +/- মূল ( বিবি - ৪.০০)) / ২ এ এবং আরও অনেক কিছু। প্রকৃতপক্ষে, এটি সম্ভবত কোনও জটিল কার্যের জন্য কাজ করবে না কারণ এগুলি বহুপক্ষীয় অনুমান হিসাবে প্রয়োগ করা হয় যা কোথাও নেতিবাচক মানগুলি ব্যবহার করবে।

সুতরাং, স্বাক্ষরবিহীন ফ্লোটগুলি বেশ অকেজো।

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


@ স্কিজ: যদি প্রতিনিধিত্ব একটি সমস্যা হয়, আপনি বলতে চাইছেন যে কেউ যদি ফ্লোট সংরক্ষণের জন্য কোনও পদ্ধতি তৈরি করতে পারে যা তার মতো দক্ষ 2's complement, তবে স্বাক্ষরবিহীন ফ্লোট নিয়ে কোনও সমস্যা হবে না?
লেজার

3
value >> shift for signed values leave the top bit unchanged (sign extend) আপনি কি এ ব্যাপারে নিশ্চিত? আমি ভেবেছিলাম যে বাস্তবায়ন-সংজ্ঞায়িত আচরণ, অন্তত নেতিবাচক স্বাক্ষরিত মানগুলির জন্য।
ড্যান

@ ড্যান: সাম্প্রতিক স্ট্যান্ডার্ডটি স্রেফ দেখেছেন এবং এটি প্রকৃতপক্ষে এটি বাস্তবায়িত সংজ্ঞায়িত বলে উল্লেখ করেছে - আমার ধারণা অনুমান যে সিপিইউর ক্ষেত্রে সাইন এক্সটেনশন নির্দেশের সাথে কোনও পরিবর্তন নেই right
স্কিজ


1
ভাসমান পয়েন্ট traditionতিহ্যগতভাবে মোড়কের পরিবর্তে (থেকে - / + ইনফ) স্যাটারেট করে। আপনি স্বাক্ষরযুক্ত বিয়োগফল ওভারফ্লোটি সন্তুষ্ট হতে 0.0পারে, বা সম্ভবত ইনফ বা নাএন আশা করতে পারেন । অথবা কেবল অনির্ধারিত আচরণ করুন, যেমন প্রশ্নের ওপিতে কোনও সম্পাদনার পরামর্শ দেওয়া হয়েছিল। পুনরায়: ট্রিগার ফাংশন: সুতরাং এর স্বাক্ষরযুক্ত-ইনপুট সংস্করণগুলি sinএবং এর সাথে সংজ্ঞা নাও এবং তাদের প্রত্যাবর্তন মানটিকে স্বাক্ষর হিসাবে গণ্য করার বিষয়টি নিশ্চিত করুন। প্রশ্নটি স্বাক্ষরবিহীন ফ্লোটের সাথে ফ্লোট প্রতিস্থাপনের প্রস্তাব দিচ্ছিল না , কেবল unsigned floatএকটি নতুন ধরণ হিসাবে যুক্ত করেছে ।
পিটার কর্ডস

9

(একদিকে যেমন পার্ল 6 আপনাকে লিখতে দেয়

subset Nonnegative::Float of Float where { $_ >= 0 };

এবং তারপরে আপনি Nonnegative::Floatঠিক তেমন কোনও অন্য ধরণের ব্যবহার করতে পারেন would)

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

[সম্পাদনা]

সি সমাবেশের মতো: আপনি যা দেখছেন তা হ'ল যা আপনি পান। একটি অন্তর্নিহিত "আমি পরীক্ষা করব যে এই ভাসাটি আপনার জন্য ননজেটিভ" এটির নকশার দর্শনের বিপরীতে। আপনি যদি সত্যিই এটি চান তবে আপনি যোগ assert(x >= 0)বা অনুরূপ করতে পারেন, তবে আপনাকে এটি স্পষ্টভাবে করতে হবে।


svn.perl.org/parrot/trunk/languages/perl6/docs/STATUS হ্যাঁ বলেছে, তবে of ...বিশ্লেষণ করে না।
মুহুর্তের

8

আমি বিশ্বাস করি যে স্বাক্ষরযুক্ত ইন্টি অফার করতে পারে তার চেয়ে বড় মানের মার্জিনের প্রয়োজনের কারণে স্বাক্ষরযুক্ত ইন্ট তৈরি করা হয়েছিল।

একটি ফ্লোটের অনেক বড় মার্জিন থাকে, তাই স্বাক্ষরবিহীন ফ্লোটের জন্য কখনও 'শারীরিক' প্রয়োজন ছিল না। এবং আপনি নিজের প্রশ্নটিতে নিজেকে উল্লেখ করার সাথে সাথে অতিরিক্ত 1 বিট যথার্থতা হত্যার কিছুই নয়।

সম্পাদনা: ব্রায়ান আর বন্ডির উত্তরটি পড়ার পরে , আমাকে আমার উত্তরটি সংশোধন করতে হবে: তিনি অবশ্যই ঠিক বলেছেন যে অন্তর্নিহিত সিপিইউগুলির স্বাক্ষরযুক্ত ফ্লোট অপারেশন ছিল না। যাইহোক, আমি আমার বিশ্বাস বজায় রাখছি যে আমি উপরে বর্ণিত কারণগুলির ভিত্তিতে এটি একটি ডিজাইনের সিদ্ধান্ত ছিল ;-)


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

7

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

কমপক্ষে পূর্ণসংখ্যার জন্য, পৃথক স্বাক্ষরযুক্ত প্রকারের প্রয়োজন কেবল সতর্কবার্তা দেওয়ার চেয়ে শক্তিশালী। উপরের সমস্ত বিষয়গুলি ভাসমানদের জন্য বিবেচনা করার প্রয়োজন নেই। সুতরাং, আমি মনে করি, তাদের জন্য হার্ডওয়্যার সমর্থনের কোনও সত্যিকারের প্রয়োজন নেই, এবং সি ইতিমধ্যে তাদের সেই মুহূর্তে সমর্থন করবে না।


5

স্কোয়ার-রুট অবশ্যই কখনও নেতিবাচক সংখ্যাকে ফেরত দেবে না। পাশাপাশি অন্যান্য জায়গা রয়েছে যেখানে নেতিবাচক ফ্লোট মানটির কোনও অর্থ নেই has স্বাক্ষরবিহীন ফ্লোটের জন্য নিখুঁত প্রার্থী।

C99 জটিল সংখ্যাগুলিকে সমর্থন করে এবং স্কয়ার্টের একটি সাধারণ জেনেরিক ফর্ম, তাই sqrt( 1.0 * I)নেতিবাচক হবে।


মন্তব্যকারীরা উপরে একটি সামান্য চকচকে হাইলাইট করেছিলেন, এতে আমি sqrtফাংশনটির পরিবর্তে টাইপ-জেনেরিক ম্যাক্রোর কথা উল্লেখ করছিলাম এবং এটি কমপ্লেক্সটিকে তার আসল অংশে কাটা দ্বারা একটি ভাসমান ভাসমান পয়েন্টের মান ফিরিয়ে দেবে:

#include <complex.h>
#include <tgmath.h>

int main () 
{
    complex double a = 1.0 + 1.0 * I;

    double f = sqrt(a);

    return 0;
}

এটিতে একটি মস্তিষ্ক-পর্দাও রয়েছে, যেহেতু যে কোনও জটিল সংখ্যার স্কয়ার্টের আসল অংশটি ধনাত্মক বা শূন্য, এবং স্কয়ার্ট (০.০ * আই) স্কয়ার্ট (০.০) আই স্কয়ার্ট (০.০) * আমি নয় -১.০।


হ্যাঁ, তবে আপনি জটিল সংখ্যা নিয়ে কাজ করলে আপনি আলাদা নামে একটি ফাংশন কল করেন। এছাড়াও রিটার্নের ধরন আলাদা। ভাল পয়েন্ট যদিও!
নীল পিপেনব্রিংক

4
স্কয়ার্টের ফলাফল (i) একটি জটিল সংখ্যা। এবং জটিল সংখ্যাগুলি অর্ডার না হওয়ার কারণে আপনি জটিল সংখ্যাটি নেতিবাচক (যেমন <0) বলতে পারবেন না
quinmars

1
কুইনমারস, নিশ্চিত যে এটি সিএসকিআরটি নয়? অথবা আপনি সি এর পরিবর্তে গণিত সম্পর্কে কথা বলবেন? আমি যাইহোক সম্মত
হই

আসলে, আমি গণিত সম্পর্কে কথা বলছিলাম। আমি কখনই সি-তে জটিল সংখ্যার সাথে ডিল করি নি।
কুইনমার্স

1
"স্কোয়ার-রুট অবশ্যই কখনও নেতিবাচক সংখ্যাকে ফেরত দেবে না।" -> sqrt(-0.0)প্রায়শই উত্পাদন করে -0.0। অবশ্যই -0.0 একটি নেতিবাচক মান নয়
chux - মনিকা

4

আমার ধারণা এটি নির্ভর করে যে আইইইই ভাসমান-পয়েন্ট স্পেসিফিকেশনগুলি কেবল স্বাক্ষরিত এবং বেশিরভাগ প্রোগ্রামিং ভাষা সেগুলি ব্যবহার করে।

আইইইই -754 ভাসমান-পয়েন্ট সংখ্যা উইকিপিডিয়া নিবন্ধ

সম্পাদনা: এছাড়াও, অন্যদের দ্বারা উল্লিখিত হিসাবে, বেশিরভাগ হার্ডওয়্যার অ-নেতিবাচক ফ্লোটগুলিকে সমর্থন করে না, তাই হার্ডওয়্যার সমর্থন থাকায় স্বাভাবিক ধরণের ফ্লোটগুলি আরও কার্যকরী হয়।


আই আইইই
-754

@ ফুকলভ উভয়ই সাধারণ ভাসমান পয়েন্ট হার্ডওয়্যার ছিল না। এটি স্ট্যান্ডার্ড সি হিসাবে গৃহীত হয়েছিল "কয়েক" বছর পরে। এটি সম্পর্কে ইন্টারনেটে ভাসমান কিছু ডকুমেন্টেশন রয়েছে। (এছাড়াও, উইকিপিডিয়া নিবন্ধে সি 99 এর উল্লেখ রয়েছে)।
টোবিয়াস ওয়ারে

তুমি কী বলতে চাচ্ছ আমি বুঝতে পারছি না। আপনার উত্তরে কোনও "হার্ডওয়্যার" নেই, এবং আইইইই
-754

@ ফুকলভি সিটি বহনযোগ্য সমাবেশ হিসাবেও পরিচিত ছিল, তাই এটি হার্ডওয়ারের খুব কাছাকাছি হতে পারে। ভাষা বছরের পর বছর ধরে বৈশিষ্ট্যগুলি অর্জন করে, এমনকি (আমার সময়ের আগে) সিতে ভাসাটি প্রয়োগ করা হলেও এটি সম্ভবত একটি সফ্টওয়্যার ভিত্তিক অপারেশন ছিল এবং বেশ ব্যয়বহুল ছিল। এই প্রশ্নের উত্তর দেওয়ার সময়, আমি এখন বলার চেয়ে স্পষ্টতই আমি যা বোঝানোর চেষ্টা করছি তা আরও ভাল করে বুঝতে পেরেছিলাম। এবং আপনি যদি স্বীকৃত উত্তরের দিকে নজর দেন তবে আপনি বুঝতে পারবেন কেন আমি আইইই 75৫৪ স্ট্যান্ডার্ড উল্লেখ করেছি। আমি যা বুঝতে পারি না তা হ'ল আপনি 10 বছরের পুরানো উত্তরটির উপর চাপ দিয়েছেন যা গৃহীত উত্তর নয়?
টোবিয়াস ওয়ারে

3

আমি মনে করি মূল কারণ স্বাক্ষরযুক্ত স্বাক্ষরযুক্ত ইনটগুলির তুলনায় স্বাক্ষরযুক্ত ফ্লোটগুলির সত্যই সীমিত ব্যবহার হবে। আমি যুক্তিটি কিনছি না কারণ এটি হার্ডওয়্যার সমর্থন করে না। পুরানো প্রসেসরের কোনও ভাসমান পয়েন্ট ক্ষমতা ছিল না, এটি সমস্ত সফ্টওয়্যারটিতে অনুকরণ করা হয়েছিল। স্বাক্ষরবিহীন ফ্লোটগুলি যদি কার্যকর হয় তবে সেগুলি প্রথমে সফ্টওয়্যারে প্রয়োগ করা হত এবং হার্ডওয়্যারটি অনুসরণ করত।


4
সিডির প্রথম প্ল্যাটফর্ম পিডিপি -7 এর একটি hardwareচ্ছিক হার্ডওয়্যার ভাসমান পয়েন্ট ইউনিট ছিল। পিডিপি -11, সি এর পরবর্তী প্ল্যাটফর্ম, হার্ডওয়্যারে 32-বিট ভাসমান ছিল। 80x86 পরে একটি প্রজন্ম এসেছিল, এমন কিছু প্রযুক্তি যা পিছনে একটি প্রজন্ম ছিল।
প্রথম

3

সি-তে স্বাক্ষরযুক্ত পূর্ণসংখ্যার প্রকারগুলি এমনভাবে সংজ্ঞায়িত করা হয় যাতে কোনও বিমূর্ত বীজগণিত রিংয়ের নিয়ম মানতে হয়। উদাহরণস্বরূপ, কোনও মান এবং এক্স এর জন্য, এক্সওয়াইয়ের সাথে ওয়াই যোগ করা এক্স উত্পন্ন করবে Un স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণের ক্ষেত্রে এই বিধিগুলি মানার গ্যারান্টি দেওয়া হয় যে কোনও ক্ষেত্রে বা অন্য কোনও সংখ্যার প্রকারের [বা স্বাক্ষরযুক্ত স্বতন্ত্র প্রকারের বিভিন্ন আকারের] সাথে জড়িত না , এবং সেই গ্যারান্টি হ'ল এই ধরণের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য। কিছু ক্ষেত্রে, কেবলমাত্র স্বাক্ষরবিহীন প্রকারের অতিরিক্ত গ্যারান্টি প্রদানের বিনিময়ে নেতিবাচক সংখ্যাগুলি উপস্থাপনের ক্ষমতা ছেড়ে দেওয়া সার্থক। স্বাক্ষরিত হোক বা না থাকুক ভাসমান পয়েন্টের ধরণগুলি বীজগণিত রিংয়ের সমস্ত নিয়ম মেনে চলতে পারে না [উদাহরণস্বরূপ তারা গ্যারান্টি দিতে পারে না যে এক্স + ওয়াইওয়াই এক্স সমান হবে]], এবং সত্যই আইইইই 'না এমনকি তাদেরকে সমতুল্য শ্রেণীর বিধি মেনে চলার অনুমতি দেয় [নির্দিষ্ট মানগুলি নিজেদের সাথে অসম তুলনা করে]। আমি মনে করি না যে একটি "স্বাক্ষরযুক্ত" ভাসমান-বিন্দু ধরণের কোনও অ্যালোমিকে মেনে চলতে পারে যা কোনও সাধারণ ভাসমান-পয়েন্ট টাইপ করতে পারে না, সুতরাং এটি কী কী সুবিধা দিবে তা আমি নিশ্চিত নই।


1

আইএইচএমও এটি কারণ যেহেতু হার্ডওয়্যার বা সফ্টওয়্যার উভয় ক্ষেত্রে স্বাক্ষরযুক্ত এবং স্বাক্ষরযুক্ত ফ্লোটিং-পয়েন্ট উভয় প্রকারের সমর্থন করা খুব ঝামেলাজনক হবে

পূর্ণসংখ্যা ধরনের জন্য আমরা ব্যবহার করতে পারে একই জন্য যুক্তি ইউনিট দিয়ে স্বাক্ষর স্বাক্ষরবিহীন পূর্ণসংখ্যা অপারেশন , 2 এর সম্পূরক চমৎকার সম্পত্তি ব্যবহার সবচেয়ে পরিস্থিতিতে কারণ ফলাফলের এইসব ক্ষেত্রেও অভিন্ন অ্যাড, সাব জন্য, অ প্রসার Mul এবং সবচেয়ে, bitwise অপারেশন। স্বাক্ষরিত এবং স্বাক্ষরবিহীন সংস্করণগুলির মধ্যে পার্থক্যযুক্ত অপারেশনগুলির জন্য আমরা এখনও যুক্তিটির বেশিরভাগ অংশটি ভাগ করতে পারি । উদাহরণ স্বরূপ

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

দুর্ভাগ্যক্রমে আমরা ভাসমান পয়েন্ট ধরণের জন্য বিলাসিতা না। সাইন বিটটি কেবল মুক্ত করেই আমাদের স্বাক্ষরবিহীন সংস্করণ থাকবে। কিন্তু তারপরে আমাদের সেই বিটটি কী ব্যবহার করা উচিত?

  • পরিসরের সাথে এটি যোগ করে পরিসীমা বাড়ান
  • মান্টিসায় এটি যুক্ত করে যথার্থতা বাড়ান। এটি প্রায়শই আরও কার্যকর, কারণ আমাদের সাধারণত পরিসরের চেয়ে আরও নির্ভুলতার প্রয়োজন

তবে উভয় পছন্দগুলির বৃহত্তর মান সীমাটির জন্য আরও বড় সংযোজন দরকার । এটি যুক্তির জটিলতা বাড়ে যখন অ্যাডারের শীর্ষ বিট বেশিরভাগ সময় অব্যবহৃত থাকে। এমনকি গুণ, বিভাগ বা অন্যান্য জটিল ক্রিয়াকলাপের জন্য আরও বেশি সার্কিটির প্রয়োজন হবে

যে সমস্ত সফ্টওয়্যার সফ্টওয়্যার ভাসমান-বিন্দু ব্যবহার করে তাদের জন্য প্রতিটি ফাংশনের জন্য আপনার 2 সংস্করণ প্রয়োজন যা মেমরির সময় এত ব্যয়বহুল ছিল না, বা আপনাকে স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন ক্রিয়াকলাপগুলির অংশগুলি ভাগ করে নেওয়ার জন্য কিছু "কৌশল" আবিষ্কার করতে হবে

তবে সি আবিষ্কারের অনেক আগেই ভাসমান-পয়েন্ট হার্ডওয়্যারটির অস্তিত্ব ছিল , তাই আমি বিশ্বাস করি যে উপরে সি উল্লেখ করা হয়েছে কারণ আমি উপরে উল্লিখিত কারণের কারণে হার্ডওয়্যার সমর্থনের অভাব ছিল

এটি বলেছে যে খ্রোনাস গ্রুপের 10 এবং 11-বিট ফ্লোটিং-পয়েন্ট টাইপের মতো বেশিরভাগ বিশেষায়িত স্বাক্ষরযুক্ত ফ্লোটিং-পয়েন্ট ফর্ম্যাট রয়েছে


0

আমি সন্দেহ করি কারণ এটি সি কম্পাইলারদের দ্বারা লক্ষ্যযুক্ত অন্তর্নিহিত প্রসেসরের স্বাক্ষরবিহীন ভাসমান পয়েন্ট সংখ্যাগুলির সাথে ডিল করার ভাল উপায় নেই।


অন্তর্নিহিত প্রসেসরের স্বাক্ষরিত ভাসমান-পয়েন্ট সংখ্যাগুলি মোকাবেলার জন্য কী ভাল উপায় ছিল? সি জনপ্রিয় হয়ে উঠছিল যখন ভাসমান-পয়েন্ট সহায়তাকারী প্রসেসরগুলি আইডিসিঙ্ক্র্যাটিক এবং কঠোরভাবে সর্বজনীন ছিল।
ডেভিড থর্নলি

1
আমি সমস্ত timeতিহাসিক টাইমলাইন জানি না তবে স্বাক্ষরিত ফ্লোটগুলির জন্য উঠতিমান হার্ডওয়্যার সমর্থন ছিল, যদিও আপনি উল্লেখ করেছেন তেমন বিরল। ভাষা ডিজাইনাররা এটির জন্য সমর্থন অন্তর্ভুক্ত করতে পারে যখন সংকলক ব্যাকেন্ডগুলি লক্ষ্যযুক্ত আর্কিটেকচারের উপর নির্ভর করে বিভিন্ন স্তরের সমর্থন পেয়েছিল।
ব্রায়ান এনসিংক

0

ভাল প্রশ্ন.

যদি আপনি যেমন বলে থাকেন তবে এটি কেবল সংকলন -কালীন সতর্কবার্তার জন্য এবং তাদের আচরণে কোনও পরিবর্তন না হলে অন্যথায় অন্তর্নিহিত হার্ডওয়্যার প্রভাবিত হয় না এবং যেমন এটি কেবল সি ++ / সংকলক পরিবর্তন হবে।

আমি এর আগেও একই কাজ করেছি, কিন্তু জিনিসটি হ'ল: এটি খুব বেশি উপকারে আসবে না। সর্বোপরি সংকলক স্থিতিক কার্যাদি খুঁজে পেতে পারে।

unsigned float uf { 0 };
uf = -1f;

বা সংক্ষিপ্ততর দীর্ঘ

unsigned float uf { 0 };
float f { 2 };
uf -= f;

কিন্তু এটি সম্পর্কে। স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকারের সাথে আপনি একটি সংজ্ঞায়িত রেকর্ডওন্ড পাবেন, যথা এটি মডুলার গাণিতিকের মতো আচরণ করে।

unsigned char uc { 0 };
uc -= 1;

এর পরে 'ইউসি' 255 এর মান ধরে।

এখন, একটি সংকলক একটি স্বাক্ষরবিহীন ফ্লোট টাইপ দেওয়া একই দৃশ্যের সাথে কী করবে? সংকলনের সময় মানগুলি না জানলে প্রথমে গণনা সম্পাদন করে তারপরে একটি সাইন-চেক করে এমন কোড তৈরি করা দরকার। কিন্তু যখন এই জাতীয় গণনার ফলাফলটি "-5.5" বলবে - কোন মানটি স্বাক্ষরবিহীন ঘোষিত ফ্লোটে সংরক্ষণ করা উচিত? কেউ অবিচ্ছেদ্য ধরণের মতো মডুলার গাণিতিক চেষ্টা করতে পারে, তবে এটি তার নিজস্ব সমস্যাগুলির সাথে আসে: বৃহত্তম মানটি নিরপেক্ষভাবে অনন্ত .... যা কাজ করে না, আপনার "অনন্ত - 1" থাকতে পারে না। এটি ধরে রাখতে পারে এমন বৃহত্তম স্বতন্ত্র মানের জন্য যাওয়াই সত্যিকারের মতো কাজ করবে না কারণ সেখানে আপনি এটি নির্ধারণ করেন। "এনএএন" প্রার্থী হবে।

শেষ পর্যন্ত এটি স্থির পয়েন্ট সংখ্যাগুলির সাথে কোনও সমস্যা হবেনা কারণ সেখানে মডুলো ভালভাবে সংজ্ঞায়িত হয়েছে।

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