ম্যাথ.প্যাও () (কখনও কখনও) জাভাস্ক্রিপ্টে ** এর সমান হয় না কেন?


118

আমি সবেমাত্র ( এমডিএন রেফারেন্স ) a**bবিকল্প হিসাবে ECMAScript 7 বৈশিষ্ট্যটি আবিষ্কার করেছি এবং সেই পোস্টে একটি আলোচনার মুখোমুখি হয়েছি , যাতে তারা দৃশ্যত আলাদাভাবে আচরণ করে। আমি এটি ক্রোম 55 তে পরীক্ষা করেছি এবং নিশ্চিত করতে পারি যে ফলাফলগুলি পৃথক।Math.pow(a,b)

Math.pow(99,99) আয় 3.697296376497263e+197

যেহেতু

99**99 আয় 3.697296376497268e+197

সুতরাং পার্থক্য Math.pow(99,99) - 99**99ফলাফল লগ ইন -5.311379928167671e+182

এখনও অবধি এটি বলা যেতে পারে যে এটি কেবল অন্য একটি বাস্তবায়ন, তবে এটি কোনও ফাংশনে মুড়িয়ে ফেলা আবার আলাদা আচরণ করে:

function diff(x) {
  return Math.pow(x,x) - x**x;
}

কলিং diff(99)রিটার্ন 0

কেন এমন হচ্ছে?

এক্সসাবোজ যেমন উল্লেখ করেছেন, এটি এই সমস্যার সংকীর্ণ হতে পারে:

var x = 99;
x**x - 99**99; // Returns -5.311379928167671e+182

7
দেখে মনে হচ্ছে যে কেউ তাদের ব্যবহৃত অ্যালগরিদম আবার লিখেছিল এবং একটি ভাসমান বিন্দু ত্রুটি পাওয়া গেছে। নম্বরগুলি শক্ত ...
ক্রিলগার

4
@ ক্রিলগার যুক্তিসঙ্গত মনে হচ্ছে, তবে কেন কোনও ফাংশনে একই ত্রুটি ঘটছে না?
থমাস অল্টমান

3
@ অ্যান্ডারসনপিমেন্টেল এমডিএন লিঙ্কটি একটি সামঞ্জস্যতা টেবিলের দিকে নির্দেশ করে
vlvaro González

7
এই দুটিয়ের মধ্যে পার্থক্য: var x = 99; x * * x; এবং 99 * * 99. অথবা ফাংশন ডিফার্ট (এক্স) 99 রিটার্ন 99 * * 99 - (x * * x); }; পরিবর্তন (99)। ব্যবধানের জন্য দুঃখিত, মন্তব্য দুটি তারা ফিল্টার :(
xszaboj

1
@ এক্সসাজোজ `likethis`এটিকে পাঠযোগ্য ও বোল্ড / ইটালিক সমস্যা এড়াতে কোডটি ব্যাকটিকগুলিতে
রেখেছেন

উত্তর:


126

99**99হয় কম্পাইল সময়ে মূল্যায়ন ( "ধ্রুবক ভাঁজ"), এবং কম্পাইলার এর powরুটিন থেকে ভিন্ন রানটাইম এক**রান টাইমে মূল্যায়ন করার সময়, ফলাফলগুলি একইরকম Math.pow- যেহেতু **আসলে কোনও কলটিতে সংকলিত হয় তাই অবাক হওয়ার কিছু নেই Math.pow:

console.log(99**99);           // 3.697296376497268e+197
a = 99, b = 99;
console.log(a**b);             // 3.697296376497263e+197
console.log(Math.pow(99, 99)); // 3.697296376497263e+197

প্রকৃতপক্ষে

99 99 = 3697296376497267726571879056288054405956687642817411024302599724235525704552775234214106500101282327279409788895483265401194299967694943594516215701934040

সুতরাং প্রথম ফলাফলটি আরও ভাল অনুমান, এখনও ধ্রুবক- এবং গতিশীল এক্সপ্রেশনগুলির মধ্যে এই জাতীয় বৈষম্য হওয়া উচিত নয়।

এই আচরণটি ভি 8-তে বাগের মতো দেখাচ্ছে। এটি প্রতিবেদন করা হয়েছে এবং আশা করছি খুব শীঘ্রই ঠিক হয়ে যাবে।


19
সুতরাং এটি মূলত জেএস 99**99আগেই কম্পিউটিং দিয়ে পারফরম্যান্স উন্নত করার চেষ্টা করছে ? এটি একটি বাগ হিসাবে বিবেচনা করা যেতে পারে, যেহেতু Math.powসংখ্যা এবং ভেরিয়েবলগুলির জন্য একই আউটপুট তৈরি করে এবং **না?
থমাস অল্টমান

3
@ থমাস অল্টম্যান: Math.rowসর্বদা রানটাইম, কনস্ট ফোল্ডিং কেবল অপারেটরদের জন্যই করা যায়। হ্যাঁ, এটি অবশ্যই একটি বাগ।
জর্জি

11
এখানের ওপি দ্বারা জিনিসগুলি দেখে একটি বাগ লগ করা হয়েছে।
জেমস থর্প

5
আমি মাইক্রোসফট এজ ব্যবহার করছি, এবং সমস্ত 3 টি ফলাফল একই: 3.697296376497263e+197, 3.697296376497263e+197, এবং 3.697296376497263e+197যথাক্রমে। এটি অবশ্যই একটি ক্রোম বাগ।
নোলোনার

4
@ থমাস অল্টম্যান যদি ধ্রুবক ভাঁজ রানটাইম ইমপ্লের চেয়ে খারাপ মান উত্পন্ন করে তবে এটি একটি বাগ। যদি এটি রানটাইমের চেয়ে আরও ভাল মান উৎপন্ন করে তবে এটি সম্ভবত বাগ হিসাবে বিবেচিত হবে বা নাও হতে পারে। এই ক্ষেত্রে, এটি আরও ভাল - সঠিক মান হ'ল "... 26772 ...", ধ্রুবক ভাঁজ "... 268" (সঠিকভাবে গোলাকার) উত্পাদন করে এবং রানটাইম "... 263" উত্পাদন করে (4+ দ্বারা বন্ধ শেষ স্থানে ইউনিট)।
17:38
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.