এমন কোন প্রোগ্রামিং ভাষা রয়েছে যেখানে 1/6 ১.০ / .0.০ এর মতো আচরণ করে?


11

কিছু দিন আগে আমি সি ++ এ প্রোগ্রাম করার সময় আমি এই ভুলটি করেছিলাম (এটি তৈরির আমার ইতিহাস আছে!)। আমার কোডের একটি অংশে, আমার কাছে 1/6 ছিল এবং আমি এটি 0.16666666666 হওয়ার আশা করছিলাম যা ঘটনাটি নয়। আপনারা সবাই জানেন যে ফলাফলটি 0 - C, C ++, জাভা, পাইথন, সমস্ত একই রকম আচরণ করে।

আমি এটি আমার ফেসবুক পৃষ্ঠায় পোস্ট করি এবং এখন যদি কোনও প্রোগ্রামিং ভাষা থাকে যেখানে 1/6একই আচরণ করে তা নিয়ে বিতর্ক রয়েছে 1.0/6.0


5
Haskell,। 1/6 = 0.16666666666666666
t123

পাওয়ারশেল 0.166666666666667 উত্পন্ন করে, যা আমাকে 1 হিসাবে পূর্ণসংখ্যা হিসাবে অবাক করে। আমি বাজি থাকতাম অন্য কয়েকটি নেট সাইট যা আপনার প্রত্যাশিত মান উত্পন্ন করে।
এল

তাত্ত্বিকভাবে এগুলির একটি সীমাহীন সংখ্যা রয়েছে .. এখানে আরেকটি রয়েছে: রেবোল , পাশাপাশি অরকা, রেড এবং এর মতো ডেরিভেটিভ। >> 1 / 6->== 0.166666666666667
ইজকাটা

লুয়া এটি করে। এটিতে কেবল একটি একক সংখ্যা প্রকার থাকে যা সাধারণত সি এর দ্বিগুণ।
মাচাডো

ক্লোজুরে 1/6আসলে 1/6 (ভগ্নাংশের প্রকার) যা জোর করে Double1.66666 ...
কাওড

উত্তর:


17

সবাই কি পাস্কলকে ভুলে গেছে?

1/6ফলন 0.1666666...(যাই হোক না কেন নির্ভুলতা সমর্থিত)।

1 div 6 উৎপাদনের 0

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

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

বেশিরভাগ সি প্রোগ্রামগুলিতে, পূর্ণসংখ্যা বিভাগ কেটে দেওয়া সম্ভবত আপনি যা চান ঠিক তেমনই।

যদি 1 / 6সি তে একটি ভাসমান-পয়েন্ট ফলাফল পাওয়া যায়, তবে:

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

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

সি ম্যানুয়ালটির 1974 সংস্করণে (এটি কে & আর এর প্রথম সংস্করণ প্রকাশের 4 বছর পূর্বে), রিচি সম্ভাব্য বিভ্রান্তির কথাও উল্লেখ করেননি:

বাইনারি / অপারেটর বিভাগকে নির্দেশ করে। গুণের ক্ষেত্রে একই ধরণের বিবেচনাগুলি প্রয়োগ হয়

যা বলে যে উভয় অপারেন্ড টাইপ হয় intবা char, ফলাফল টাইপ হয় int

হ্যাঁ, এটি কিছু সি প্রোগ্রামারদের, বিশেষত নতুনদের জন্য বিভ্রান্তির উত্স - তবে সি খুব নবাগত-বান্ধব বলে খ্যাতিমান হয় না।


5
প্যাসকেল. সি তাদের ভুল হওয়ার ঠিক আগে বিশদ পাওয়া।
ম্যাসন হুইলার

এবং তারপরে আলগোল তার উত্তরসূরিদের চেয়ে উন্নতি করেছিল (যার সংখ্যা সি এবং পাস্কাল উভয়ই রয়েছে))
এপ্রোগ্রামার

পাস্কাল - বিশদটি সঠিকভাবে পাওয়া (10 এর একটি ফ্যাক্টর দিন বা নিন)
মার্টিন বেকেট

1
আমি মূলত লিখেছিলাম 1.666666..., যা স্পষ্টতই ভুল। আমার খোঁড়া অজুহাত হ'ল আমি পাস্কাল পরীক্ষার প্রোগ্রামটি প্রিন্ট করেছি1.6666666666666667E-0001
কিথ থমসন

16

আসলে পাইথন 3 এ এই আচরণটি পরিবর্তন করা হয়েছিল এবং এটি এখন আপনার প্রত্যাশা মতো আচরণ করে ( //বর্তমানে পূর্ণসংখ্যা বিভাগের জন্য ব্যবহৃত হয়)।


ধন্যবাদ। আপনার মনে অন্য কোন প্রোগ্রামিং ল্যাঙ্গুয়েজ রয়েছে? বেসিক পরিবার হতে পারে?
পৌয়া

1
@ পৌয়া: পাস্কাল পরিবারের পক্ষে এই আচরণটি আদর্শ। /সর্বদা একটি ভাসমান-পয়েন্ট মান উত্পাদন করে এবং divপূর্ণসংখ্যা বিভাগের জন্য একটি পৃথক অপারেটর ( ) ব্যবহৃত হয়।
ম্যাসন হুইলার 18 ই

13

বিশিষ্ট ভাষাগুলির মধ্যে, জাভাস্ক্রিপ্ট। 1.0 / 6.0 = 1/6 = 0.16666666666666666।

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

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


6
এটি "থাম্বের নিয়ম" নয়। এটি সি এর একটি নিয়ম এবং মুষ্টিমেয় ভাষা যা সি এর ভুলগুলি অন্ধভাবে অনুলিপি করে।
ম্যাসন হুইলারের

4
@ ম্যাসনওহিলার: ফরট্রান কি "সি এর ভুল অন্ধভাবে অনুলিপি করেছিল"? আমি ব্যক্তিগতভাবে বিশ্বাস করি যে সুনির্দিষ্টভাবে নকশিত ভাষাগুলি কেটেঙ্ক্টেড বিভাগ বনাম পূর্ণসংখ্যার পরিমাণের আনুমানিক বিভাগের (এবং এছাড়াও বিটিডাব্লু, মূল্য এবং রেফারেন্সিয়াল সমতার জন্য) পৃথক অপারেটর ব্যবহার করা উচিত, তবে ফরট্রানের দিনগুলিতে নকশার সিদ্ধান্ত সম্ভবত যুক্তিযুক্ত ছিল। এর অর্থ এই নয় যে প্রতিটি ভাষার ফোরট্রান ১৯৫০ এর দশকে সেইভাবে কাজ করা উচিত।
সুপারক্যাট

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

2
প্রোগ্রামিংয়ের বাইরে গণিত বিভাগের জন্য পূর্ণসংখ্যার নিয়ম বিবেচনা করে।
এরিক পুনরায়

5
@ মেসনওহিলার: প্রোগ্রামিং শুদ্ধ গণিত নয়। গাণিতিকভাবে, 1/6 একটি যুক্তিযুক্ত সংখ্যা এবং বাইনারি ভাসমান পয়েন্ট সংখ্যাটি দ্বারা সঠিকভাবে উপস্থাপন করা যায় না। একমাত্র সুনির্দিষ্ট প্রতিনিধিত্ব হ'ল অংকের সংখ্যার সাথে ছয় বারের অনুপাত হিসাবে।
কেভিন

7

এমন অনেকগুলি ভাষা রয়েছে যেখানে ((1/6)*6)ফলাফল 1-এ হয় না, 0 এ নয় For উদাহরণস্বরূপ, পিএল / এসকিউএল, অনেক বেসিক উপভাষা, লুয়া।

দুর্ভাগ্যক্রমে, এই সমস্ত ল্যাঙ্গগুলিতে .166666667, বা 0.16666666666667 বা এর অনুরূপ কিছুতে 1/6 ফলাফল। এই সামান্য পার্থক্য থেকে মুক্তি পেতে আমি ((1/6) * 6) == 1 রূপটি বেছে নিয়েছি।


7
এটাই প্রশ্ন নয়।
রক মার্টে

20
দুর্ভাগ্যক্রমে, এই সমস্ত ল্যাঙ্গগুলিতে .166666667, বা 0.16666666666667 বা এর অনুরূপ কিছুতে 1/6 ফলাফল। ((1/6)*6)==1এই সামান্য পার্থক্যগুলি থেকে মুক্তি পেতে আমি রূপটি বেছে নিয়েছি তবে দেখে মনে হচ্ছে যে আমি কিছু লোকের গণিত দক্ষতার চেয়ে বেশি গুরুত্ব পেয়েছি।
ব্যবহারকারী 281377

1
@ RocMartí হ্যাঁ, এটা সত্যিই ... হয়
MattDavey

1
আমি অবাক হয়ে দেখব (1.0 / 6.0) * 6 ঠিক 1 এর সমান! (১.০ / .0.০) ফলাফলের গোলাকার ফলে সামান্য পার্থক্য দেখা যাবে। (যদিও এমন কয়েকটি ভাষা থাকবে যা অনন্ত নির্ভুলতার জন্য ডিফল্ট হয়ে থাকে)
সজয়ের্ড

1
@ সোজার্ড: এটি খুব বেশি পরিমাণে ছাড়েনি যে এটি আসলেই সঠিক। পাঁচটি উল্লেখযোগ্য পরিসংখ্যানের সাথে সমস্ত মানের সাথে নির্ভুলভাবে 1/11 * 11 এর দশমিক বিবেচনা করুন। 1/11 এর মান 9.0909 * 10 ^ -2। 11 দ্বারা গুণিত করুন এবং রাউন্ডিংয়ের আগে একজন 99.9999 * 10 / -2 পাবেন। পাঁচটি উল্লেখযোগ্য পরিসংখ্যানের বৃত্তাকার এবং ফলাফলটি হবে 1.0000 * 10 ^ 0। লক্ষ্য করুন যে কীটি হ'ল 1/6 এর মান্টিসটা "... 0101010101 ..."। উপস্থাপনার শেষ বিটটি যদি "1" হয় তবে এটি ছয় দ্বারা গুণ করলে এবং বৃত্তাকারে 1 টি পাওয়া যাবে। শেষ বিটটি যদি শূন্য হয় তবে তা হত না।
সুপারক্যাট

3

হাস্কেল 1/6 এবং 1.0 / 6.0 কে একইভাবে 0.16666666666666666 হিসাবে বিবেচনা করে। এটি একই মান হিসাবে 1 / 6.0 এবং 1.0 / 6 রেন্ডার করে।

এটি অন্যান্য ভাষার মতো হ্যাসকেলে মৌলিক সংখ্যাসূচক প্রকারের কারণে নয়। সত্যিকারের পূর্ণসংখ্যা বিভাগ কিছুটা জটিল ...


2

হ্যাঁ, পার্ল তা করে। ওয়ান-লাইনার

perl -e '$x=1/6;print "$x\n";'

এর ফলাফল ফলাফল:

0.166666666666667

আমি বিশ্বাস করি যে পিএইচপি একইভাবে কাজ করে।

যুক্ত করতে সম্পাদিত: আমি আরও বিশ্বাস করি যে 1/6 == 1.0/6.0প্রশ্নে থাকা ভাষাটি দুর্বলভাবে টাইপ করা উচিত তার জন্য একটি প্রয়োজনীয় (তবে পর্যাপ্ত নয়) শর্ত ।


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

1
@delnan - en.wikipedia.org/wiki/Weak_typing আমি এটি একটি শক্তিশালী ভাবে টাইপ ভাষা যা আছে সম্ভব হতে পারে অনুমান করা /স্বয়ংক্রিয়ভাবে আর্গুমেন্ট ধরনের উপর নির্ভর করে ওভারলোড হয়ে গেছে, কিন্তু যে লঙ্ঘন মত মনে হয় বিস্ময়ের ন্যূনতম সূত্র থেকে আমি ...

2
দুর্বল / শক্তিশালী টাইপিং দুর্বল সংজ্ঞায়িত (যেমন উইকিও বোঝায়), দয়া করে এড়িয়ে চলুন এবং নির্দিষ্ট থাকুন। আমি আপনার সংজ্ঞাটিকে অন্তর্নিহিত রূপান্তরকে নিষিদ্ধ করি, তবে অ্যাড-হক পলিমারফিজম নয়? যদি তা হয় তবে হাস্কেলকে বিবেচনা করুন, যার কোনও অন্তর্নিহিত রূপান্তর নেই তবে বেশ কার্যকরভাবে সম্পাদিত হয়েছে (যেমন হিসাবে 99% সময় কাজ করে এবং প্রাণঘাতী দ্বারা উপলব্ধি করা যায়) সংখ্যাসূচক পলিমারফিজম। এবং কেন এটি অবাক হবে? আমি যে নির্ভুলতা চান তার উপর নির্ভর করে যদি কোনও অপারেটরের প্রতিটি একক দৃষ্টিতে আমাকে অনেকগুলি সংখ্যক বিন্দু যুক্ত করতে হয় তবে এটি আমার কাছে আরও অবাক করে দেবে (বিরক্তিকর না বলে)।

2
@ জ্যাকমনেই আমি বেশিরভাগ আগতদের কাছে মনে করি এটি দু'টি পূর্ণসংখ্যাকে দ্বিগুণ করার ফলে ফলাফলটি 1/2 এর চেয়ে 0 সমান হওয়া উচিত more সমস্ত পূর্ণসংখ্যার পরেও গণিতে বিভাগের অধীনে বন্ধ হয় না। এছাড়াও ডেলানান উল্লেখ করেছেন যে, হাস্কেল দৃ strongly়ভাবে টাইপিত ভাষার উদাহরণ যা / দুটি সংখ্যায়, কোনও পূর্ণসংখ্যা তৈরি করে না। এবং পাইথন 3 অন্যটি।
sepp2k

1
হ্যাক্স ভাষা দৃ strongly়ভাবে টাইপ করা হয়েছে (অনুমান করা যায়), এবং এখনও এটির কোনও পূর্ণসংখ্যা বিভাগ নেই, কেবল ভাসমান। সুতরাং আপনি সেখানে যান।
কে.স্টেফ

2

/পূর্ণসংখ্যার উপর স্কুয়াক স্মলটাল্কে ভগ্নাংশ তৈরি করে। সুতরাং এটি ভাসমান বিভাগের মতো না হলেও এখনও (1/6)*61 প্রদান করে।


সমস্ত স্মলটালক -80 থেকে উদ্ভূত হয়েছে (যা প্রায় সমস্ত স্মলটাল্ক)। অ্যাম্বার একটি সমসাময়িক ব্যতিক্রম (যা বোধগম্য, জাভাস্ক্রিপ্টে সংকলিত হচ্ছে)।
হার্বি

2

হ্যাঁ, আমি সবেমাত্র টিআই বেসিক -এ নির্মিত আমার টিআই -৯৯ / ৪ এ'র পরীক্ষা করেছি । এটি যেমন সমস্ত সংখ্যাসূচক এক্সপ্রেশনকে ভাসমান পয়েন্ট হিসাবে বিবেচনা করে, বিভাগ অপারেশনটিও ভাসমান পয়েন্ট।

 TI BASIC READY
>PRINT 1/6
  .1666666667

>


2

ম্যাটল্যাব। সংখ্যাসূচক অক্ষরগুলি ডিফল্টরূপে দ্বিগুণ হয়।

>> 1/6
ans =
    0.1667

2

Clojure ডিফল্টভাবে ভগ্নাংশ ব্যবহার করে। এটা তোলে 1.0 / 6.0 হিসাবে একই নয়, কিন্তু আপনার সাথে রূপান্তর করতে পারেন floatবা doubleআপনি যখন প্রয়োজন।

user=> (/ 1 6)
1/6
user=> (* (/ 1 6) 2)
1/3
user=> (pos? (/ 1 6)) ; Is 1/6 > 0?
true
user=> (float (/ 1 6))
0.16666667

1

আশ্চর্যজনকভাবে, এটি উইন্ডোজ পাওয়ারশেল (সংস্করণ 3) এ সঠিকভাবে কাজ করছে বলে মনে হচ্ছে ।

PS C:\> 1.0 / 6.0
0.166666666666667

PS C:\> 1/6
0.166666666666667

এছাড়াও পাইপথন 3 তে কাজ বলে মনে হচ্ছে সেপ 2 কে উল্লেখ করা হয়েছে। অন্য দুটি ভাষাগুলি আমি আরইপিএল, স্কালা এবং রুবিতে সহজেই উপলভ্য করেছি, উভয়ই পূর্ণসংখ্যা বিভাগ করে এবং 0 দেয়।


0

রেজেক্স ভাষা সর্বদা একটি গাণিতিকভাবে সঠিক উত্তর তৈরি করে। উদাহরণস্বরূপ: 5/2 = 2.5। রেজিক্স একটি দুর্দান্ত ভাষা যা যথেষ্ট পরিমাণে ব্যবহৃত হয়নি। তত্ত্ব অনুসারে, যখন কোনও সংকলক আপনি কী চান তা নির্ধারণ করতে পারে না, তবে সঠিক গণিতটি করা আরও ভাল, তবে এটি দক্ষ নাও হতে পারে। রেজিক্স // অপারেটরও সরবরাহ করে।

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