অজগরকে পূর্ণসংখ্যায় ফ্লোটকে রূপান্তর করার নিরাপদতম উপায়?


215

পাইথনের গণিত মডিউলটিতে floor& এর মতো হ্যান্ডি ফাংশন রয়েছে ceil। এই ফাংশনগুলি একটি ভাসমান পয়েন্ট নম্বর নেয় এবং এর নীচে বা উপরে নিকটতম পূর্ণসংখ্যা ফেরত দেয়। তবে এই ফাংশনগুলি উত্তরটিকে একটি ভাসমান পয়েন্ট সংখ্যা হিসাবে ফিরিয়ে দেয়। উদাহরণ স্বরূপ:

import math
f=math.floor(2.3)

এখন fফেরত:

2.0

রাউন্ডিং ত্রুটির ঝুঁকি না চালিয়ে (এই উদাহরণস্বরূপ যদি ফ্লোটটি 1.99999 এর সমতুল্য হয়) বা সম্ভবত আমার অন্য কোনও ফাংশন ব্যবহার করা উচিত, তবে এই ভাসাটি থেকে কোনও পূর্ণসংখ্যার নিরাপদতম উপায় কী?


7
math.floor v2.6 এ একটি ভাসা ফেরত দেয় তবে এটি v3 এর মধ্যে একটি পূর্ণসংখ্যা ফেরত দেয় । এই মুহুর্তে (ওপি'র প্রায় ছয় বছর পরে), এই সমস্যাটি খুব কমই প্রদর্শিত হতে পারে।
সানচো.এস পুনরায় ইনস্টল করুন মনিকাসেলিও

তবে নম্পী এখনও ভাসমান ফেরত দেয় তাই প্রশ্নটি বৈধ।
ভিন্সনজুও

উত্তর:


178

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

এই কাজগুলি মোটেই তুচ্ছ নয়! এটি আইইইই ভাসমান পয়েন্ট উপস্থাপনার একটি সম্পত্তি যা ইনটফ্লোয়ার = ⌊⋅⌋ যদি প্রশ্নের মধ্যে সংখ্যাগুলির পরিমাণটি খুব কম হয় তবে ইন্টার (ফ্লোর (২.৩)) হতে পারে যেখানে বিভিন্ন উপস্থাপনা সম্ভব be

উইকিপিডিয়া থেকে উদ্ধৃতি ,

পরম মান কোন পূর্ণসংখ্যা কম বা 2 সমান 24 ঠিক একক স্পষ্টতা বিন্যাসে প্রতিনিধিত্ব যেতে পারে, এবং পরম মান কোনো পূর্ণসংখ্যা কম বা 2 সমান 53 ঠিক ডবল স্পষ্টতা বিন্যাসে প্রতিনিধিত্ব করা যেতে পারে।


8
কিছুটা গভীর হওয়ার জন্য +1। আপনি কেন একটি সংক্ষিপ্ত বিবরণ দিতে পারেন: en.wikedia.org/wiki/ ফ্লাইটিং_পয়েন্ট : ডি
গর্ডন গুস্তাফসন

পাইথন 2-এ, একটি "আন্ত" সি "ইনট" এর সমান। পাইথন 3-তে এটি "int, stackoverflow.com/questions/13795758/… এর আকারের সীমাবদ্ধতা নেই বলে মনে হয়" "ইনট" এর অর্থ অপারেটিং সিস্টেম এবং অন্তর্নিহিত হার্ডওয়্যারের উপরও নির্ভর করে en en.wikedia দেখুন । org / wiki / 64-bit_computing # 64-bit_data_models । আপনি যদি সি-এপি, পাইথন 3 নিয়ে প্রোগ্রামিং করছেন তবে আপনার প্ল্যাটফর্মে দীর্ঘ এবং আকার_আর
জুয়ান

112

ব্যবহার int(your non integer number)এটি পেরেক হবে।

print int(2.3) # "2"
print int(math.sqrt(5)) # "2"

4
এটি নেতিবাচক সংখ্যার জন্য কাজ করবে না: floorরাউন্ড ডাউন যখন intরাউন্ড 0 এর দিকে
জোচেন

1
@ জোচেন আমি int(-2.3)পাইথন বিতরণ ক্যানোপি ২.7..6 এ পরীক্ষা করেছি এবং -2প্রত্যাশার মতো পেয়েছি । আনুষ্ঠানিক গণিত সংজ্ঞা একইভাবে পূর্ণসংখ্যার সংখ্যাগুলি নেতিবাচক হতে পারে definition
srodriguex

5
আমি সম্মতি জানাই, আপনি যেমন বলেন তেমন int(-2.3)দেয় -2, কারণ এটি গোল হয়ে যায় 0, যেমন এই ক্ষেত্রে। বিপরীতে, ব্যবহৃত আসল প্রশ্ন math.floor, যা সর্বদা গোল হয়: math.floor(-2.3)দেয় -3.0
জোচেন

1
এটি আসলে কোনও সমস্যা নয়। ওপি কেবল ফলাফলের বাইরে একটি পূর্ণসংখ্যা চায় math.floorএবং এই উত্তরটি দেখায় যে কীভাবে একটি ফ্লোটকে পূর্ণসংখ্যায় রূপান্তর করা যায়। থেকে math.floorintint(math.floor(2.3))
ভাসাটি

4
আপনি কি প্রশ্নটি পড়েছেন? তিনি ইনট () ফাংশন সম্পর্কে অবগত , তবে আপনি যদি 2.0 এর পরিবর্তে 1.9999 দিয়ে সমস্যায় পড়তে পারেন তবে জিজ্ঞাসা করেছেন। আপনার উত্তর মোটেও কোনও উত্তরের নিকটেই নয়, আপনি পুরো
বিষয়টিটি

48

আপনি রাউন্ড ফাংশন ব্যবহার করতে পারেন। আপনি যদি দ্বিতীয় কোনও প্যারামিটার ব্যবহার করেন না (# টি উল্লেখযোগ্য অঙ্কের) তবে আমি মনে করি আপনি যে আচরণটি চান তা পাবেন will

আইডিএল আউটপুট।

>>> round(2.99999999999)
3
>>> round(2.6)
3
>>> round(2.5)
3
>>> round(2.4)
2

28
roundকমপক্ষে পাইথন ২.6-তে একটি ফ্ল্যাট নম্বরও প্রদান করে।
ফিলিপ

8
পাইথন ৩.১.২-তে, বৃত্তাকার একটি ইনট প্রদান করে।
রবার্ট

2
প্রকৃতপক্ষে, পাইথন 3.x এ উভয় roundএবং floorফেরত পূর্ণসংখ্যা। সুতরাং আমি অনুমান করি যে প্রশ্নটি পাইথন ২.x সম্পর্কিত।
ফিলিপ

4
তাই হয়তো int(round(2.65))?
টিউউয়েন

1
round(6.5)6 দেয় কেন ? ceil()অন্যান্য সমস্ত ক্ষেত্রে দশমিকের পরে যখন তাত্ক্ষণিক 5 (বা 9 অবধি বেশি) উপস্থিত হবে তখন মনে হবে এটি ভাসা ভাসা। কেন এটি এই ক্ষেত্রে কাজ করছে না? বা অন্য কোনও ক্ষেত্রে যখন সংখ্যাটি একটি ছয় দিয়ে শেষ হয় এবং দশমিকের পরে 5 হয় ...
ক্যানড

43

পূর্ববর্তী দুটি ফলাফলের সংমিশ্রণে আমাদের কাছে রয়েছে:

int(round(some_float))

এটি মোটামুটি নির্ভরযোগ্যভাবে একটি পূর্ণসংখ্যাতে একটি ফ্লোটকে রূপান্তর করে।


আপনি যদি খুব দীর্ঘ ভাসাটি বৃত্তাকার চেষ্টা করেন তবে কি হবে? এটি কি অন্তত একটি ব্যতিক্রম উত্থাপন করবে?
অ্যাগোস্টিনো

@ অ্যাগোস্টিনো "খুব দীর্ঘ ভাসা" বলতে কী বোঝ?
kralyk

@ ক্র্লাইক আমার অর্থ একটি সাধারণ যেটি ধরে রাখতে পারে floatতার চেয়ে বড় সংখ্যাকে প্রতিনিধিত্ব করে int। পাইথন 2 এ, এমন কোনও floatমান রয়েছে যা আপনি কেবলমাত্র long(বৃত্তাকার পরে) ব্যবহার করে প্রতিনিধিত্ব করতে পারেন ?
অ্যাগোস্টিনো

@ ক্র্লাইক আপনার মানে, রাউন্ডের পরে? সুতরাং, তাদের ব্যতিক্রম বাড়াতে কাস্টিং হবে বা কেবল তাদের কেটে দেবে?
এগ্রোস্টিনো

@ অ্যাগোস্টিনো না, int()ফাংশনটি যা প্রয়োজন তার ভিত্তিতে একটি intবা একটি উত্পাদন করে long...
ক্রেলিক

18

এই কাজগুলি মোটেই তুচ্ছ নয়! এটি আইইইই ভাসমান পয়েন্ট উপস্থাপনার একটি সম্পত্তি যা ইনটফ্লোয়ার = ⌊⋅⌋ যদি প্রশ্নের মধ্যে সংখ্যাগুলির পরিমাণটি খুব কম হয় তবে ইন্টার (ফ্লোর (২.৩)) হতে পারে যেখানে বিভিন্ন উপস্থাপনা সম্ভব be

এটি কেন এই ব্যাপ্তিতে কাজ করে এই পোস্টটি ব্যাখ্যা করে

দ্বিগুণ, আপনি কোনও সমস্যা ছাড়াই 32 বিট পূর্ণসংখ্যার প্রতিনিধিত্ব করতে পারেন। সেখানে না পারেন, কোনো rounding বিষয় হতে। আরও স্পষ্টভাবে, ডাবলস 2 53 এবং -2 53 এর মধ্যে এবং এর মধ্যে সমস্ত পূর্ণসংখ্যার প্রতিনিধিত্ব করতে পারে ।

সংক্ষিপ্ত বিবরণ : একটি ডাবল 53 বাইনারি অঙ্ক পর্যন্ত সঞ্চয় করতে পারে। যখন আপনার আরও প্রয়োজন হয়, তখন ডানদিকে শূন্যের সাথে সংখ্যাটি প্যাড করা হয়।

এটি অনুসরণ করে যে 53 টি হ'ল বৃহত্তম সংখ্যা যা প্যাডিং ছাড়াই সংরক্ষণ করা যায়। স্বাভাবিকভাবেই, সমস্ত (পূর্ণসংখ্যার) সংখ্যার কম সংখ্যার প্রয়োজন সঠিকভাবে সংরক্ষণ করা যেতে পারে।

একটিতে 111 যুক্ত করা (বাদ দেওয়া) 111 (53 টি) এর ফলস্বরূপ 100 ... 000, (53 জিরো) পাওয়া যায়। যেমনটি আমরা জানি, আমরা 53 টি সংখ্যা সংরক্ষণ করতে পারি, যা ডানদিকের শূন্য প্যাডিং তৈরি করে।

এখান থেকে 2 53 আসে।


আরও বিশদ: আইইইই -754 ফ্লোটিং পয়েন্ট কীভাবে কাজ করে তা আমাদের বিবেচনা করা দরকার।

  1 bit    11 / 8     52 / 23      # bits double/single precision
[ sign |  exponent | mantissa ]

তারপরে সংখ্যাটি নিম্নরূপ গণনা করা হয় (এখানে বিশেষ অপ্রাসঙ্গিক বিষয়গুলি বাদ দিয়ে):

-1 চিহ্ন × 1.মন্তিসা × 2 এক্সপোনেন্ট - পক্ষপাতিত্ব

যেখানে পক্ষপাত = 2 ঘনিষ্ঠ - 1 - 1 , অর্থাৎ 1023 এবং 127 যথাক্রমে ডাবল / একক নির্ভুলতার জন্য।

2 এক্স দ্বারা গুণিত করে সমস্ত বিট এক্স স্থানকে বামে সরিয়ে নিয়ে যাওয়া জেনে যাওয়া সহজ যে কোনও সংখ্যার মান্টিসায় সমস্ত বিট থাকতে হবে যা দশমিক পয়েন্টের ডানদিকে শূন্য হয়।

শূন্য ব্যতীত যে কোনও পূর্ণসংখ্যার বাইনারিতে নিম্নলিখিত ফর্মটি থাকে:

1x ... x যেখানে x -es এমএসবি এর ডানদিকে বিটগুলি উপস্থাপন করে (সবচেয়ে উল্লেখযোগ্য বিট)।

যেহেতু আমরা শূন্যকে বাদ দিয়েছি, সেখানে সর্বদা একটি এমএসবি থাকবে — যার কারণে এটি সঞ্চয় করা হয়নি। পূর্ণসংখ্যা সংরক্ষণ করার জন্য, আমাদের অবশ্যই এটি পূর্বোক্ত আকারে আনতে হবে: -1 চিহ্ন × 1.মন্তিসা × 2 এক্সপোনেন্ট - পক্ষপাতিত্ব

এটি এমএসবি এর বাম দিকে কেবল এমএসবি না হওয়া পর্যন্ত দশমিক পয়েন্টের উপরে বিটগুলি স্থানান্তর হিসাবে একই কথা বলছে। দশমিক বিন্দুর ডানদিকে সমস্ত বিটগুলি মন্টিসায় সংরক্ষণ করা হয়।

এটি থেকে আমরা দেখতে পাচ্ছি যে আমরা এমএসবি বাদে সর্বাধিক ৫২ টি বাইনারি সংখ্যা সঞ্চয় করতে পারি।

এটি অনুসরণ করে যে সমস্ত বিট সুস্পষ্টভাবে সঞ্চিত সেখানে সর্বাধিক সংখ্যা

111(omitted)111.   that's 53 ones (52 + implicit 1) in the case of doubles.

এর জন্য, আমাদের এক্সপোনেন্টটি সেট করতে হবে, যে দশমিক পয়েন্টটি 52 জায়গায় স্থানান্তরিত হবে। আমরা যদি একের সাহায্যে অতিরিক্ত বাড়িয়ে তুলি তবে দশমিক পয়েন্টের পরে আমরা ডান বামে অঙ্কটি জানতে পারি না।

111(omitted)111x.

কনভেনশন অনুসারে, এটি ০. পুরো মান্টিসাকে শূন্যে সেট করে, আমরা নিম্নলিখিত সংখ্যাটি পাই:

100(omitted)00x. = 100(omitted)000.

এটি 1 এর পরে 53 জিরো, 52 টি সঞ্চিত এবং 1 জন যোগের কারণে যুক্ত হয়েছে।

এটি 2 53 প্রতিনিধিত্ব করে , যা সীমানা চিহ্নিত করে (উভয় নেতিবাচক এবং ধনাত্মক) যার মধ্যে আমরা সঠিকভাবে সমস্ত পূর্ণসংখ্যা উপস্থাপন করতে পারি। যদি আমরা একটিতে 2 53 যোগ করতে চাই, তবে আমাদের একের সাথে অন্তর্নিহিত শূন্য (দ্বারা চিহ্নিত x) স্থাপন করতে হবে, তবে এটি অসম্ভব।


8

math.floor সর্বদা একটি পূর্ণসংখ্যার নম্বর এবং এইভাবে ফিরে আসবে int(math.floor(some_float)) কখনই গোলাকার ত্রুটিগুলি প্রবর্তন করবে না।

রাউন্ডিং ত্রুটি ইতিমধ্যে চালু করা যেতে পারে math.floor(some_large_float), যদিও বা এমনকি প্রথম স্থানে একটি ফ্লোটে একটি বিশাল সংখ্যক সঞ্চয় করার সময়। (বড় সংখ্যা ফ্লোটে সংরক্ষণের সময় নির্ভুলতা হারাতে পারে))


7
থেকে: docs.python.org/2/library/math.html - math.floor (x) - এক্স এর তলটি একটি ফ্লোট হিসাবে ফিরিয়ে দিন, বৃহত্তম মানের পূর্ণসংখ্যার মান x এর চেয়ে কম বা সমান।
বিল রোজমাস

ইতিমধ্যে যখন একই জিনিসটি করা হয় তখন কেন আপনাকে গণিতের কল করতে হবে?
অ্যালেক্স

1
@ অ্যালেক্স: intএবং floorঅবশ্যই নেতিবাচক সংখ্যার জন্য বিভিন্ন মান ফিরিয়ে দিন।

8

আপনার যদি স্ট্রিং ফ্লোটকে একটি ইনটে রূপান্তর করতে হয় তবে আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন।

উদাহরণ: '38.0'থেকে38

এটিকে কোনও ইনটে রূপান্তর করতে আপনি এটিকে একটি ভাসমান এবং তারপরে একটি int হিসাবে কাস্ট করতে পারেন। এটি ফ্লোট স্ট্রিং বা পূর্ণসংখ্যার স্ট্রিংয়ের জন্যও কাজ করবে।

>>> int(float('38.0'))
38
>>> int(float('38'))
38

দ্রষ্টব্য : এটি দশমিকের পরে কোনও সংখ্যা ছিনিয়ে নেবে।

>>> int(float('38.2'))
38

1

ভেরিয়েবলগুলি ব্যবহার করে একটি বাস্তব / ফ্লোটকে পূর্ণসংখ্যায় রূপান্তর করতে অন্য কোড নমুনা। "ভেল" হ'ল একটি আসল / ভাসমান সংখ্যা এবং পরবর্তী সর্বোচ্চ INTEGER, "নিউভেল" তে রূপান্তরিত।

import arcpy.math, os, sys, arcpy.da
.
.
with arcpy.da.SearchCursor(densifybkp,[floseg,vel,Length]) as cursor:
 for row in cursor:
    curvel = float(row[1])
    newvel = int(math.ceil(curvel))

0

যেহেতু আপনি 'নিরাপদ' উপায়ের জন্য জিজ্ঞাসা করছেন, আমি শীর্ষ উত্তর ছাড়া অন্য একটি উত্তর সরবরাহ করব।

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

if int(some_value) == some_value:
     some_value = int(some_value)

উদাহরণস্বরূপ, যদি ভাসমানটি 1.0 হয়, তবে 1.0 টি 1 এর সমান So সুতরাং int- এ রূপান্তর কার্যকর হবে। এবং যদি ভাসাটি ১.১ হয়, ইনট (১.১) সমান হয় 1, এবং 1.1! = 1. সুতরাং মানটি একটি ভাসমান হিসাবে থাকবে এবং আপনি কোনও নির্ভুলতা হারাবেন না।


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