জাভাতে ভাসা এবং ডাবল ডেটাটাইপ


220

ফ্লোট ডেটা টাইপটি একটি একক-নির্ভুলতা 32-বিট আইইইই 754 ফ্লোটিং পয়েন্ট এবং ডাবল ডেটা টাইপ একটি ডাবল-স্পষ্টতা 64৪-বিট আইইইই 754 ফ্লোটিং পয়েন্ট।

এর মানে কী? এবং কখন ডাবল বা তদ্বিপরীত পরিবর্তে আমার ফ্লোট ব্যবহার করা উচিত?


8
মেমরির ব্যবহার গুরুতর হলে আপনার দ্বিগুণের পরিবর্তে ফ্লোট ব্যবহার করা উচিত। আপনার যদি আরও সুনির্দিষ্ট গণনার প্রয়োজন হয় তবে ডাবল ব্যবহার করুন।
এভারভিডিড

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


5
@ মাকোটো আসলে, আমি কখনও ফ্লোট ব্যবহার করি নি, কেবল ডাবলস। তবে এমন অ্যাপ্লিকেশন থাকতে পারে (তত্ত্ব অনুসারে) যা প্রচুর পরিমাণে ভাসমান পয়েন্ট সংখ্যা রাখে, তাই 2x মেমরির ব্যবহার সমালোচনা হতে পারে। তত্ত্বে, ofc; অনুশীলনে আপনি সর্বদা অন্য সার্ভার কিনতে পারেন ।
এভারভিডিড

3
মেমরিটি সংরক্ষণ করতে আমি 4 বাইট এবং এমনকি 2 বাইট স্থির নির্ভুলতা নম্বর ব্যবহার করেছি তবে আপনার যদি বিলিয়ন কোটি না থাকে তবে এটির পক্ষে এটির সম্ভাবনা কম। সময় আপনার পরিবর্তে "ভাসা" এর "নকল" লিখতে (এটা আরও একটি চিঠি আছে) লাগে মূল্য 1000x অতিরিক্ত মেমরি আপনি ব্যবহার চেয়ে বেশি, কিন্তু যদি ব্যবহার doubleবদলে floatআপনি যদি একটি স্পষ্টতা সংক্রান্ত বাগ-থেকে সংরক্ষণ করে, এটা মূল্য ।
পিটার লরি

উত্তর:


259

উইকিপিডিয়া পৃষ্ঠা এটি একটি ভাল জায়গা থেকে শুরু হয়।

সংক্ষেপে:

  • float1 টি চিহ্ন, 8 টি বিট এবং 1 টি বিট সহ 32 টি বিটগুলিতে প্রতিনিধিত্ব করা হয় (বা বৈজ্ঞানিক-স্বরলিপি নম্বরটি যা অনুসরণ করে: 2.33728 * 10 12 ; 33728 হ'ল তাৎপর্য)।

  • double 1 টি বিট, এক্সটোনেন্টের 11 বিট এবং 52 বিট গুরুত্বের সাথে 64৪ বিটে উপস্থাপন করা হয়।

ডিফল্টরূপে, জাভা doubleতার ভাসমান-পয়েন্টের সংখ্যাগুলিকে উপস্থাপন করতে ব্যবহার করে (সুতরাং একটি আক্ষরিক 3.14টাইপ করা হয় double)। এটি এমন ডেটা টাইপ যা আপনাকে আরও বেশি সংখ্যার পরিসীমা দেবে, তাই এর ব্যবহারকে আমি দৃ strongly়ভাবে উত্সাহিত করব float

কিছু নির্দিষ্ট লাইব্রেরি যে আসলে আপনার ব্যবহারের জোর হতে পারে float, তবে সাধারণভাবে - যদি না আপনি গ্যারান্টি করতে পারেন যে আপনার ফলাফলে মাপসই ছোট যথেষ্ট হবে float'র নির্ধারিত সীমার , তাহলে এটি সঙ্গে অপ্ট সেরা double

আপনার যদি নির্ভুলতার প্রয়োজন হয় - উদাহরণস্বরূপ, আপনার দশমিক মান নাও থাকতে পারে যা ভুল (যেমন 1/10 + 2/10), বা আপনি মুদ্রা দিয়ে কিছু করছেন (উদাহরণস্বরূপ, সিস্টেমে .3 10.33 উপস্থাপন করছেন ), তারপরে এমন একটি ব্যবহার করুন BigDecimal, যা একটি সমর্থন করতে পারে নির্ভুল পরিমাণে নির্বিচারে পরিমাণ এবং মার্জিতভাবে পরিস্থিতিগুলি পরিচালনা করে।


4
233728 == প্রদত্ত উদাহরণে মান্টিসা না? মানে, পূর্ণসংখ্যার অংশটি আর কোথায় আছে?
JaLoveAst1k

1
@ mathguy54: বৈজ্ঞানিক স্বরলিপি হিসাবে 2 পুরো পূর্ণসংখ্যার হবে এবং .33728 ম্যান্টিসা হবে। এখানে একটি উল্লেখ আছে।
মাকোটো

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

2
@ ট্রিক্সিওল্ফ, আপনি আরও নির্দিষ্ট করে বলতে পারেন, আপনি কি দুটি পূর্ণসংখ্যা (পূর্ণসংখ্যা এবং দশমিক অংশ) ব্যবহার করার প্রস্তাব করেছিলেন? এবং আপনি কমন মুদ্রার কথা বলছেন, বাকী কী? কিছু পরিমাণ 6 দশমিক দিয়ে মূল্যায়ন করা হয় যাতে আপনি সহজভাবে পারবেন না *100। দয়া করে, আপনার এখানে একটি বক্তব্য রয়েছে তবে আপনি আরও সুনির্দিষ্ট হতে পারেন :)
এক্সেলএইচ

9
@ অ্যাক্সেলহ আর্থিক গণনার বিভ্রান্তি ব্যতীত যেখানে ভগ্নাংশ সেন্টের অস্তিত্ব থাকতে পারে, অর্থ সর্বদা বিচ্ছিন্ন থাকে। আপনি ডেটা সংরক্ষণ করার জন্য একটি পূর্ণসংখ্যার প্রকার ব্যবহার করবেন। সুতরাং $ 5.34 53 534 হিসাবে সংরক্ষণ করা হবে The ডলারের অংশটি পূর্ণসংখ্যার গণিতে ভাল / 100 এবং সেন্টগুলি পূর্ণসংখ্যার গণিতে ভল% 100 হয়, যেখানে% বাকী অপারেশনকে বোঝায়। দশমিক দশকের বেশি জায়গায় অর্থের জন্য এটি এখনও অবিচ্ছেদ্য হিসাবে সংরক্ষণ করা উচিত কারণ এটি বিযুক্ত। এটি বিযুক্ত না হলেও, প্রায়শই আপনি বেশিরভাগ সময় একটি পৃথক স্টোরেজে ফিরে যেতে চাইবেন কারণ এটি সুনির্দিষ্ট তাই আপনি গোলাকার ত্রুটির জন্য অর্থ হারাবেন না।
ট্রিক্সি ওল্ফ

72

একটি ভাসা প্রায় আপনাকে দেয়। 6-7 দশমিক অঙ্কের নির্ভুলতা যখন একটি ডাবল আপনাকে প্রায় দেয়। 15-16। এছাড়াও সংখ্যার পরিসীমা ডাবলের জন্য আরও বড়।

একটি ডাবল স্টোরেজ স্পেসের 8 বাইট প্রয়োজন হয় যখন একটি ফ্লোটের প্রয়োজন 4 বাইট।


13

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


   Name     Width in Bits   Range 
    double  64              1 .7e308 to 1.7e+308
    float   32              3 .4e038 to 3.4e+038


ভাসা

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

এখানে কিছু উদাহরণ ভাসমান ভেরিয়েবল ঘোষণা:

ফ্লোট হাইটেম্প, লোটেম্প;


ডবল

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


এই উত্তরটি পরিষ্কারভাবে পরিষ্কার করা হয়েছে যে কখন আমাদের ভাসা এবং ডাবল ব্যবহার করা উচিত? কেন নয়?
ইয়ে

8
আমরাও floatনা doubleধরনের সেরা ত্রুটি থাকার কারণে rounding জন্য সুযোগ খুলুন, জাভা মুদ্রার জন্য ব্যবহার করা হয়। এই নিবন্ধটি আরও বিশদে যায়: javapractices.com/topic/TopicAction.do?Id=13
পিপিটিসান

1
"ডলার এবং সেন্ট উপস্থাপনের সময় ভাসাটি কার্যকর হতে পারে।" - না, না, না, নননোনো কখনও নয়, কখনও মুদ্রাকে ফ্লোট / ডাবল হিসাবে সঞ্চয় করবেন না।
ক্রিয়াকলাপ হ্রাস

2

জাভা এখনও গণনার জন্য ডাবল ব্যবহার করার পক্ষপাতিত্ব বলে মনে হচ্ছে:

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

package palettedos;
import java.util.*;

class Palettedos{
    private static Scanner Z = new Scanner(System.in);
    public static final double pi = 3.142;

    public static void main(String[]args){
        Palettedos A = new Palettedos();
        System.out.println("Enter the base and height of the triangle respectively");
        int base = Z.nextInt();
        int height = Z.nextInt();
        System.out.println("Enter the radius of the circle");
        int radius = Z.nextInt();
        System.out.println("Enter the length of the square");
        long length = Z.nextInt();
        double tArea = A.calculateArea(base, height);
        double cArea = A.calculateArea(radius);
        long sqArea = A.calculateArea(length);
        System.out.println("The area of the triangle is\t" + tArea);
        System.out.println("The area of the circle is\t" + cArea);
        System.out.println("The area of the square is\t" + sqArea);
    }

    double calculateArea(int base, int height){
        double triArea = 0.5*base*height;
        return triArea;
    }

    double calculateArea(int radius){
        double circArea = pi*radius*radius;
        return circArea;
    }

    long calculateArea(long length){
        long squaArea = length*length;
        return squaArea;
    }
}

আমারও আজ একই সমস্যা ছিল। এই পক্ষপাতিত্বের পেছনের কারণ কী হতে পারে?
শচি

2

এটি ত্রুটি দেবে:

public class MyClass {
    public static void main(String args[]) {
        float a = 0.5;
    }
}

/ MyClass.java:3: ত্রুটি: বেমানান প্রকারগুলি: ডাবল থেকে ভাসমান ভাসা a = 0.5 এ সম্ভাব্য লসী রূপান্তর;

এটি পুরোপুরি সূক্ষ্ম কাজ করবে

public class MyClass {
    public static void main(String args[]) {
        double a = 0.5;
    }
}

এটি পুরোপুরি জরিমানাও কাজ করবে

public class MyClass {
    public static void main(String args[]) {
        float a = (float)0.5;
    }
}

কারণ : জাভা উচ্চতর নির্ভুলতা নিশ্চিত করতে বাস্তব সংখ্যাগুলি দ্বিগুণ হিসাবে সঞ্চয় করে।

গণনার সময় ডাবল আরও বেশি জায়গা নেয় তবে আরও সুনির্দিষ্ট লাগে এবং ভাসা কম স্থান নেয় তবে কম সুনির্দিষ্ট লাগে।


1

আইইইই স্ট্যান্ডার্ড অনুযায়ী, ভাসাটি একটি আসল সংখ্যার 32 বিট উপস্থাপনা যখন ডাবল একটি 64 বিটের উপস্থাপনা।

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

এছাড়াও যখন উচ্চ নির্ভুলতা প্রয়োজন হয় তখন ডাবল ব্যবহারকে উত্সাহ দেওয়া হয়। দীর্ঘকাল আগে প্রয়োগ করা কয়েকটি লাইব্রেরি পদ্ধতিতে এখনও প্রয়োজন হিসাবে ভাসমান ডেটা প্রকারের প্রয়োজন (এটি কেবলমাত্র এটি ফ্লোট ব্যবহার করে প্রয়োগ করা হয়েছিল, অন্য কিছুই!)।

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


0

এই উদাহরণটি জাভাতে একটি ফ্লোট থেকে কীভাবে সাইন (বামতম বিট), খাঁটি (8 টি বিট) এবং ম্যান্টিসা (23 ডানদিকের বিট) বের করবেন তা চিত্রিত করে।

int bits = Float.floatToIntBits(-0.005f);
int sign = bits >>> 31;
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1);
int mantissa = bits & ((1 << 23) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa));

একই পদ্ধতির ডাবল এর জন্য ব্যবহার করা যেতে পারে (11 বিট এক্সপোনেন্ট এবং 52 বিট ম্যান্টিসা)।

long bits = Double.doubleToLongBits(-0.005);
long sign = bits >>> 63;
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1);
long mantissa = bits & ((1L << 52) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa));

ক্রেডিট: http://sj.github.io/java-float/


0

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

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