2010-10-17 34 views
30

Bất cứ ai có thể vui lòng cho tôi biết làm thế nào tôi có thể chuyển đổi số phao này: 12.25 thành nhị phân? Tôi biết cách chuyển đổi "12" nhưng không phải là 0,25Làm thế nào để chuyển đổi số phao sang nhị phân?

Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn

+4

thủ công :) Tôi có thể làm điều đó theo chương trình sau đó. –

+0

Bạn muốn nhận được '1100.01'? – SLaks

+0

Có :) Tôi cần biết cách tính 0,25 đến nhị phân –

Trả lời

21

Giữ nhân số thập phân sau bởi 2 cho đến khi nó trở thành 1.0:

0.25*2 = 0.50 
0.50*2 = 1.00 

và kết quả là theo thứ tự ngược là .01

+0

Tôi hiểu rồi, Điều đó có vẻ logic bây giờ, Cảm ơn bạn :) –

+10

@Slim Black: Hãy coi chừng: hoạt động tốt cho các số như 0.25, trong đó có biểu diễn chính xác ở dạng nhị phân, nhưng không cho các số như 0,1, không: 0,1 * 2 = 0,2, 0,2 * 2 = 0,4, 0,4 * 2 = 0,8, 0,8 * 2 = 1,6, 0,6 * 2 = 1,2, 0,2 * 2 = 0,4, ... Nó lặp lại mãi mãi, và kết quả là 0,0 (0011) (phần trong dấu ngoặc đơn lặp lại). –

+0

@Slim Black: Và lưu ý, để thực hiện điều này một cách chính xác theo lập trình, bạn sẽ cần số học thập phân - xem bài viết của tôi http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/, phần cụ thể dec2bin_f().) –

13

(d nghĩa là số thập phân, b có nghĩa là nhị phân)

  1. 12.25d là phao của bạn.
  2. Bạn viết 12d ở dạng nhị phân và xóa nó khỏi phao của bạn. Chỉ còn lại phần còn lại (.25d).
  3. Bạn viết dấu chấm.
  4. Trong khi phần còn lại (0,25d) không bằng 0 (và/hoặc bạn muốn nhiều chữ số hơn), nhân nó với 2 (-> 0,50d), xóa và viết chữ số còn lại của dấu chấm (0) và tiếp tục với phần còn lại mới (.50d).
+0

Có, Cảm ơn bạn đã trả lời :) –

+1

Nếu float của tôi là 5.1 thì sao? Thực hiện các bước của bạn, tôi đã tham gia vào một vòng lặp vô hạn, hãy trợ giúp! – nautilusvn

+2

@nautilusvn: bởi vì không có sức mạnh của 2 cũng là bội số của 10, con số đó có một chuỗi các chữ số vô hạn. bạn có thể muốn hủy bỏ tính toán của bạn ở đâu đó. – comonad

1
x = float(raw_input("enter number between 0 and 1: ")) 

p = 0 
while ((2**p)*x) %1 != 0: 
    p += 1 
    # print p 

    num = int (x * (2 ** p)) 
    # print num 

    result = '' 
    if num == 0: 
     result = '0' 
    while num > 0: 
     result = str(num%2) + result 
     num = num/2 

    for i in range (p - len(result)): 
     result = '0' + result 
    result = result[0:-p] + '.' + result[-p:] 

print result #this will print result for the decimal portion 
+0

OP đã yêu cầu cách thực hiện việc này theo cách thủ công. –

+0

có thể bạn cũng muốn thêm tham chiếu đến nơi bạn nhận được từ đó. mã python này trông quen thuộc với tôi. –

8

xem xét bên dưới ví dụ

Chuyển đổi 2,625 đến nhị phân.

Chúng tôi sẽ xem xét phần nguyên và phân đoạn riêng biệt.

The integral part is easy, 2 = 10. 

Đối với các phần phân đoạn:

0.625 × 2 = 1.25 1 Generate 1 and continue with the rest. 
0.25 × 2 = 0.5  0 Generate 0 and continue. 
0.5  × 2 = 1.0  1 Generate 1 and nothing remains. 

Vì vậy 0,625 = 0,101, và 2,625 = 10,101.

Xem liên kết this để biết thêm thông tin.

3

giá trị float được lưu trữ trong định dạng IEEE 754 vì vậy chúng tôi không thể bí mật trực tiếp như số nguyên, char thành nhị phân. Nhưng chúng ta có thể chuyển đổi float sang nhị phân thông qua con trỏ.

main() 
{ 
float a=7.5; 
int i,*p; p=&a; 
for (sizeof(int)*8-1;i>=0;i--) 
printf("%d",(*p)>>i&1); 
} 
OUTPUT::0 10000001 11100000000000000000000---space for better clarification not included in part of the program. 
+1

Tôi biết cũ, nhưng giá trị của ** i ** ở đây là gì? – Michi

Các vấn đề liên quan