ভেরিয়েবলের পরিবর্তে ভাসমান পয়েন্ট ধ্রুবকগুলি যখন পাস করা হয় তখন% f কেন বড় মানগুলি মুদ্রণ করে?


9

প্রদত্ত প্রোগ্রামে আমি কেন প্রত্যেকটির জন্য আলাদা আলাদা ফলাফল পেয়েছি printf?

#include <stdio.h>
int main()
{
    float c = 4.4e10;
    printf("%f\n", c);
    printf("%f\n", 4.4e10);
    return 0;
}

এবং এটি নিম্নলিখিত আউটপুটটি দেখায়:

44000002048.000000
44000000000.000000

4
এখনও অবধি উত্তরগুলি ব্যাখ্যা করে যে 4.4e10এটি একটি doubleধ্রুবক যা floatপ্রারম্ভিক সময়ে রূপান্তরিত হয় cতবে doubleপাস করার সময় হিসাবে রাখা হয় printf। তবে, আপনি এটি জানতেও পছন্দ করতে পারেন যে একটি fপ্রত্যয় যুক্ত করা এটি একটি floatধ্রুবক হয়: মুদ্রণটি 4.4e10fএকই মানটি প্রদর্শিত হবে যা শুরুতে ফলাফল থেকে cআসে 4.4e10f। পার্থক্য floatথেকে ধ্রুবক doubleধ্রুবক ফ্লোটিং পয়েন্ট গাণিতিক সঙ্গে মানের কাজ করছেন গুরুত্বপূর্ণ হতে পারে।
এরিক পোস্টপিসিল

এই রূপান্তর পদ্ধতির নাম কি কিছু আছে? আমি এটি সম্পর্কে পড়তে চাই।
ব্যবহারকারী 10056563

আপনি যখন জানতে থেকে রুপান্তরের চাও doubleকরতে floatসি ল্যাঙ্গুয়েজ ঘটে? অথবা আপনি কী রূপান্তর থেকে কোন মানগুলি ফল দেয় তা জানতে চান, অর্থাত্ রূপান্তরটির কী প্রভাব পড়ে? অথবা অন্য কিছু?
এরিক পোস্টপিসিল

আমি জিজ্ঞাসাবাদ করছি তন্ন তন্ন এখানে প্রত্যুত্তর কিংবা মান কিন্তু যখন আমি ছোট ছিলাম এবং শেখার Cআমরা ব্যবহৃত printf("%f",x)একটি জন্য floatএবং printf("%lf",x)একটি জন্য double। বিষয়গুলি কখন বদলে গেল? এবং কীভাবে একজন স্পষ্টভাবে একটি (একক) মুদ্রণ করবে float- printf("%hf",x)??
অ্যাড্রিয়ান মোল

2
@Adrian %lfprintf মধ্যে হিসাবে একই জিনিস %ffloatএকটি ভেরিয়েবল আর্গুমেন্টে A কে doubleসংকলক দ্বারা রূপান্তরিত করা হয়, ঠিক যেমন shortএকটিতে রূপান্তরিত হয় int
এসএস আন

উত্তর:


9

floatহ'ল এমন একটি ধরণ যা একটি 32-বিট ভাসমান পয়েন্ট সংখ্যা ধরে রাখে, এবং ধ্রুবকটি 4.4e10প্রতিনিধিত্ব করে doubleযা একটি 64-বিট ভাসমান পয়েন্ট সংখ্যা ধরে রাখে (যেমন একটি ডাবল- প্রিভিসেশন ফ্লোটিং পয়েন্ট সংখ্যা)

আপনি যখন অর্পণ 4.4e10করেন c, মানটি 4.4e10যথাযথভাবে উপস্থাপন করা যায় না (ম্যান্টিসা নামে পরিচিত একটি প্যারামিটারে গোলাকার ত্রুটি) এবং নিকটতম সম্ভাব্য মান (44000002048) সংরক্ষণ করা হয়। যখন এটি পাস করা হয় printf, তখন এটি রাউন্ডিং ত্রুটি সহ ফিরিয়ে প্রচার করা হয় double

দ্বিতীয় ক্ষেত্রে, মানটি doubleসংকীর্ণ এবং প্রশস্ত না হয়ে পুরো সময় হয় এবং এটি এমনটি ঘটে যে কোনও একটি doubleমানটিকে সঠিকভাবে উপস্থাপন করতে পারে।

এই অবাঞ্ছিত আচরণ হয়, তাহলে আপনি ডিক্লেয়ার করতে পারেন cহিসেবে doubleএকটি জন্য বিট আরো স্পষ্টতা (কিন্তু হুঁশিয়ার যে আপনি এখনও স্পষ্টতা সীমা আঘাত করব অবশেষে)।


3

আপনি এখানে দুটি ভিন্ন ধরণের মান মুদ্রণ করছেন।

প্রথম ক্ষেত্রে আপনি বিভিন্ন ধরণের ভেরিয়েবলের জন্য একটি মান নির্ধারণ করছেন float। একটিটির যথার্থতা floatমোটামুটি or বা dec দশমিক সংখ্যা, সুতরাং যদি মানটি যথাযথভাবে উপস্থাপন করা না যায় তবে আপনি সেই ধরণের দ্বারা প্রতিনিধিত্ব করা নিকটতম মানটি দেখতে পাবেন।

দ্বিতীয় ক্ষেত্রে আপনি ধ্রুবক 4.4e10যা টাইপ আছে পাস করছেন double। এই ধরণের প্রায় 16 দশমিক সংখ্যক নির্ভুলতা রয়েছে এবং মানটি এই সীমার মধ্যেই থাকে তাই সঠিক মানটি মুদ্রিত হয়।


এটি কেন শেষে বিশেষত 2048 মুদ্রণ করে?
ব্যবহারকারী 10056563

@ ব্যবহারকারী 10056563 কারণ এটি 4.4e10 এর নিকটতম সংখ্যা যা 32 বিট ফ্লোটে সংরক্ষণ করা যেতে পারে।
dbush
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.