ورود

View Full Version : دسترسی به چهاربایت float32 در پایتون



salehjg
دوشنبه 27 آبان 1398, 22:53 عصر
درود و وقت بخیر
معمولا این جور سوالات رو با گوگل کردن پیدا میکردم ولی وضعیت اینترنت چاره ای نذاشته...

هدف اینه که یک متغییر ممیز شناور 32 بیتی را به چهار متغیر 8 بیتی تبدیل کنیم.
در زبان سی با union ها (اگر درست نوشته باشم) انجامش میدادیم:


union{
float a;
unsigned char binary_a[4];
}

(البته شبه کد رو ذهنی نوشتم شاید اشتباه باشه ولی خب منظورمو میرسونه)
همین کارو میخوام با پایتون انجام بدم و ترجیحا بدون numpy و... چون با اینترنت ملی نمیدونم چطوری پکیج نصب کنم :گیج:

ممنون

akpa125
سه شنبه 28 آبان 1398, 11:47 صبح
عدد رو ببر در مبنای باینری و استرینگش کن بعدا با slice به چهار قسمت تبدیلش کن

salehjg
سه شنبه 28 آبان 1398, 15:08 عصر
تغییر مبنا؟
اگر خودم تغییر مبنا بدم که میشه fixed point و داده از دست میره
اگر روش خاصی در پایتون هست که ممیز شناور رو تبدیل کنه ممنون میشم اشاره کنید

در جاوا و سی شارپ میشد که یک آبجکت رو serialize کنیم. اینجا با پایتون نمیشه همچین حرکتی زد؟

the king
چهارشنبه 29 آبان 1398, 12:57 عصر
درود و وقت بخیر
معمولا این جور سوالات رو با گوگل کردن پیدا میکردم ولی وضعیت اینترنت چاره ای نذاشته...

هدف اینه که یک متغییر ممیز شناور 32 بیتی را به چهار متغیر 8 بیتی تبدیل کنیم.
در زبان سی با union ها (اگر درست نوشته باشم) انجامش میدادیم:


union{
float a;
unsigned char binary_a[4];
}

(البته شبه کد رو ذهنی نوشتم شاید اشتباه باشه ولی خب منظورمو میرسونه)
همین کارو میخوام با پایتون انجام بدم و ترجیحا بدون numpy و... چون با اینترنت ملی نمیدونم چطوری پکیج نصب کنم :گیج:

ممنون
متاسفانه تسلطی به پایتون ندارم، فقط در حد دو روز راهنماشو خوندم. شاید راه حل بهتری هم باشه ولی خروجی باینری این رو با مقادیر معادل #C مقایسه کردم و جواب داده :
یک عدد اعشاری مثل n داریم :


>>> n : float = 1.23


کتابخانه مربوط به struct رو وارد می کنیم :


from struct import *


عدد رو به آرایه ای از بایت ها تبدیل می کنیم که معادل float زبان C باشه که 32 بیتی است، اگر بجای 'f' از 'd' استفاده می کردیم معادل double زبان C میشد که 64 بیتی است.


b : bytes = pack('f', n)


حالا در b چهار بایت مجزا شده اند، b[0] و b[1] و b[2] و b[3] ولی اگر بخواهید می توانید در یک عدد 32 بیتی ترکیب شان را هم داشته باشید :


x : int = int.from_bytes(b, byteorder='little', signed=False)