2015-05-16 18 views
7

Là một dự án cá nhân, tôi đã viết trình biên dịch cho C của riêng tôi như ngôn ngữ để nhắm mục tiêu giả lập CPU của thiết kế của riêng tôi. Là một phần của điều này, tôi muốn thực hiện một thư viện điểm nổi tiêu chuẩn (điển hình độ chính xác đơn IEEE), nhưng tôi đã đấu tranh để suy nghĩ của một cách để in ra nổi trong một cách dễ đọc (như trong 1.2345 thay vì số nguyên dữ liệu thô), tốt nhất tôi có thể nghĩ là tạo ra các giá trị cho bản ghi 2 và thực hiện một số phép lạ để lấy số ở dạng phù hợp để in.Ngôn ngữ xử lý in nổi dưới mui xe như thế nào?

Có thuật toán chuyển đổi phao sang dạng dễ in hay để in nổi có thể được thực hiện mà không cần sử dụng printf("%f",float_value); hoặc nhập kiểu đúc trong ngôn ngữ C như ngôn ngữ?

+1

Chắc chắn, tại sao bạn không hãy nhìn vào một thực hiện của 'printf'? –

+0

Hoặc một trong số chúng, ví dụ 'glibc' vì mã nguồn của nó có sẵn để tải xuống. –

+0

có thể trùng lặp với [mã nguồn của các hàm c/C++] (http://stackoverflow.com/questions/1127328/source-code-of-cc-functions) –

Trả lời

3

Nó có thể là một hack bẩn của một chức năng, nhưng bạn có thể sử dụng điều này làm cơ sở cho một hàm để hiển thị đúng số dấu phẩy động. Nó không sử dụng bất kỳ chức năng phụ trợ nào khác, ngoài putchar để thực sự in một cái gì đó, và nó không bao gồm tất cả các tình huống (như số của bạn là một NaN, hoặc thậm chí là một tiêu cực!) Nhưng, tốt, nó chỉ là một điểm khởi đầu :

#include <stdio.h> 

void printfloat (float n) 
{ 
    int whole = n; 
    int power = 1; 
    int digit; 

    /* Find out the largest divisor for printing the integer part */ 
    while (whole>=1) 
    { 
     whole /= 10; 
     power *= 10; 
    } 
    power /= 10; 

    /* Prints the integer part of the number */ 
    whole = n; 
    while (power>=1) 
    { 
     digit = whole/power; 
     whole %= power; 
     putchar ('0'+digit); 
     power /= 10; 
    } 

    /* Prints the decimal point */ 
    putchar ('.'); 

    /* And now the fractional part */ 
    n = n-(int)n; 
    while(n!=0) 
    { 
     digit = n*10; 
     putchar ('0'+digit); 
     n*=10; 
     n = n-(int)n; 
    } 
    putchar ('\n'); 
} 

int main() 
{ 
    float n = 123.45678; 

    printfloat(n); 
    return 0; 
} 

Bạn có thể kiểm tra nó ở đây: http://goo.gl/V4pgNZ

+3

Không, điều này không thể được sử dụng làm cơ sở cho một chức năng phù hợp. Nó chỉ là một hack bẩn, và để di chuyển từ nó đến một cái gì đó mà hoạt động chính xác một trong những nhu cầu để ném này đi. Trong phòng thủ của bạn, để thực hiện một nhị phân thích hợp để thập phân trong C từ đầu một về cơ bản cần phải bắt đầu bằng cách thực hiện một thư viện ít nhất thô sơ bignum (http://www.openwall.com/lists/musl/2012/04/10/6) nhưng nếu một người không muốn làm phiên bản chính xác, ít nhất có thể làm http://www.opensource.apple.com/source/ruby/ruby-18/ruby/missing/strtod.c?txt. Và đọc http://www.exploringbinary.com/ của couse. –

6

theo tôi được biết, hiện trạng của nghệ thuật để in số dấu chấm động là gia đình Grisu các thuật toán, bởi Florian Loitsch. Bạn có thể đọc bài báo here.

Đối với một giới thiệu đôi chút dễ dàng hơn đến các vấn đề trong việc chuyển đổi dấu chấm động nhị phân để thập phân (và ngược lại), tôi triệt để giới thiệu trang web của Rick Regan, http://www.exploringbinary.com/

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