2010-10-14 49 views

Trả lời

8

i * 1.0 nên chuyển nó thành số dấu phẩy động. Bất kỳ phép tính nào liên quan đến các số dấu phẩy động của bất kỳ loại nào được chuyển đổi hoàn toàn thành extendend và sau đó được chuyển đổi hoàn toàn thành loại kết quả mong muốn khi gán. Ngược lại với C/C++, tất cả các phép tính xảy ra trong Extended (float 80 bit, định dạng nội bộ của đơn vị floatingline x87) và được chuyển đổi về sau.

thực (i) cũng có thể hoạt động.

+0

Tôi muốn nó theo cách khác. – Aftershock

2

Bạn có thể làm:

myFloat := myInteger; 
+0

Kiểu chữ đó không hợp lệ: E2089 Kiểu chữ không hợp lệ. –

1

3 cách có thể, tùy thuộc vào loại biểu thức mà bạn có.

var 
    Float: Double; 
    Int1: Integer; 
    Int2: Integer; 
begin 
    Int1 := 925; 
    Int2 := 21; 
    Float := Int1; // simple form: assign it 
    Writeln(Float); 
    Float := Int2/Int1; // floating point division: assign it 
    Writeln(Float); 
    Float := (1.0 * Int2) * Int1; // integer operator: multiply by 1.0 and add parenthesis 
    Writeln(Float); 
end. 

Output:

9.25000000000000E+0002 
2.27027027027027E-0002 
1.94250000000000E+0004 
+2

Đầu tiên +1, sau đó là -1; Tôi rất thích động lực cho cả hai: nó giúp tôi viết câu trả lời tốt hơn. –

4

Integer để nổi

Có không cần phải cast bất cứ điều gì, chỉ cần gán

Float1 := Integer1; 

Câu hỏi của bạn dường như được nổi để Integer

Hai tùy chọn

Integer1 := Trunc(Float1); //truncate 

hoặc

Integer1 := Round(Float1); //Round 
+0

Đối diện của Trunc() thực sự là Ceil(). Trunc() sẽ quay về 0, Ceil() sẽ tròn theo hướng + Infinity (nếu nó là số dương) hoặc -Infinity (nếu âm). – Trinidad

+3

Không Ceil sẽ luôn luôn tròn đến + inf, Tầng sẽ luôn luôn tròn để -inf, và Trunc luôn luôn đến 0. Vì vậy, đối diện của Ceil() không phải là Trunc, nhưng Tầng. – CodesInChaos

+0

Có, bạn chính xác =) Rất tiếc. – Trinidad

1

Tôi có này hai (i có nhiều hơn, nhưng đối với ví dụ sẽ là đủ) oveloaded chức năng:

interface 
    function MyFunc(Value:Integer):Integer;overload; 
    function MyFunc(Value:Double):Double;overload; 
implementation 
    function MyFunc(Value:Integer):Integer; 
    begin 
     MyFunc:=Math.Ceil({Do some extra complicated Math calcs} 
          * 
          MyFunc({¿How to Type Cast as Double?} Value) 
         ); 
    end; 
    function MyFunc(Value:Double):Double; 
    begin 
     MyFunc:={Do some Math calcs with Value}; 
    end; 

Làm thế nào có thể trong định kiểu Integer vào đúp ? Tôi ghét đặt ´ (Giá trị 1.0 *) ´ hoặc ´ (Giá trị 0.0 +) ´ sử dụng ít thời gian CPU hơn, phải tồn tại một số cách khác để thực hiện điều đó.

BEWARE: i có nghĩa là định dạng trên cuộc gọi đó !!! HÃY THẬN TRỌNG: cuộc gọi có chức năng bị quá tải, cuộc gọi được gọi tới một số khác

Hy vọng ai đó tìm cách, gây ra `MyFunc ((Double) Value) 'cho biết typecast không hợp lệ ... một đôi là không thể ???? một đôi có thể lưu trữ một số nguyên ... cũng nhiều hơn, khi gán nó cast nó trực tiếp ... ´MyVarOfTypeDouble: = MyvarOfTypeInteger; ´ hoạt động hoàn hảo.

Vấn đề đi kèm với chức năng quá tải ... nó không biết tôi muốn gọi lên phiên bản đúp một ... đó là lý do tại sao một dàn diễn viên là cần thiết ...

Nói cách khác ... điều này sẽ làm việc như một nét duyên dáng:

interface 
    function MyFunc_Integer(Value:Integer):Integer; 
    function MyFunc_Double(Value:Double):Double; 
implementation 
    function MyFunc_Integer(Value:Integer):Integer; 
    begin 
     MyFunc_Integer:=Math.Ceil({Do some extra complicated Math calcs} 
            * 
            MyFunc_Double(Value) 
           ); 
    end; 
    function MyFunc_Double(Value:Double):Double; 
    begin 
     MyFunc_Double:={Do some Math calcs with Value}; 
    end; 

Xem, nếu chức năng tên là khác nhau, không cần phải đúc ... cho đến khi tôi tìm thấy một giải pháp tốt hơn tôi phải sợ rằng tôi sẽ sử dụng '(0.0 + Value)', nơi nó nên làm việc (nhưng không) ´ (Double) value, whe Value là kiểu Integer.

Vì vậy, phản hồi của tôi là ...thay vì đặt mã '(Double) SomethingOfTypeInteger' (có thể hoạt động nhưng không thích nó) ... hãy đặt mã khác ´ (0.0 + SomethingOfTypeInteger) ´, tôi khuyên bạn không nên sử dụng ´ (1.0 * SomethingOfTypeInteger) ´ vì nó là ít hơn nhiều hiệu quả ...

Đừng bao giờ nghĩ về việc tạo ra một chức năng như thế này (nó cũng tồi tệ nhất là hơn 1,0 * Giá trị):

function ConvetIntegerToDouble(Value:Integer):Double; 
begin 
    ConvetIntegerToDouble:=Value; 
end; 

đó là chức năng tuân thủ tuyệt vời ... nhưng mất rất nhiều , nhiều thời gian hơn là đặt giá trị ´0.0 +.

Bây giờ để Rất, Rất ... rất nhiều người rất thông minh ... thấy điều này (rất xấu xí) mã:

interface 
     function MyFunc(Value:Integer):Integer;overload; 
     function MyFunc(Value:Real48):Real48;overload; 
     function MyFunc(Value:Real):Real;overload; 
     function MyFunc(Value:Double):Double;overload; 
     procedure CanYouGuess; 
    implementation 
    var 
     MyVarOfTypeDouble:Double; 
     function MyFunc(Value:Integer):Integer; 
     begin 
      MyFunc:=Round(MyFunc(1.0+Value)); 
     end; 
     function MyFunc(Value:Real48):Real48; 
     begin 
      MyFunc:=MyFunc(2.0+Value); 
     end; 
     function MyFunc(Value:Real):Real; 
     begin 
      MyFunc:=MyFunc(4.0+Value); 
     end; 
     function MyFunc(Value:Double):Double; 
     begin 
      MyFunc:=(8.0+Value); 
     end; 
     procedure CanYouGuess; 
     var 
      MyVarOfTypeReal48:Real48; 
      MyVarOfTypeReal:Real; 
     begin 
      MyVarOfTypeDouble:=MyFunc(0); // What value will be on MyVarOfTypeDouble? 
      MyVarOfTypeReal48:=0; 
      MyVarOfTypeDouble:=MyFunc(MyVarOfTypeReal48); // What value will be on MyVarOfTypeDouble? 
      MyVarOfTypeReal:=0; 
      MyVarOfTypeDouble:=MyFunc(MyVarOfTypeReal); // What value will be on MyVarOfTypeDouble? 
      MyVarOfTypeDouble:=MyFunc(0.0); // What value will be on MyVarOfTypeDouble? 
     end; 

Bây giờ cố gắng đoán các giá trị ... đọc mã nó không phải là rõ ràng những gì cuộc gọi phải đi ... tôi vượt qua một số nguyên, sau đó bên trong Integer oveload phiên bản ... mà một trong những được gọi là ... Real48 quá tải hoặc Real một hoặc đôi? ... tương tự áp dụng cho việc vượt qua một Real48 và cũng đi qua một Real ...

Trình biên dịch không tìm thấy lỗi nào cả ... nhưng tôi không biết (nếu chỉ có một) sẽ được gọi ... mà không truy tìm, tất nhiên!!! bạn có thể?

Đối với tình huống như vậy là nơi diễn Explicit sẽ là tuyệt vời để làm việc ...

Xin lưu ý tôi đặt 1.0 trở lên, 2.0+, 4.0+ 8.0 trở lên ... quyền hạn của 2 ... vì vậy bất kỳ khoản của bất kỳ hoặc một số người trong số họ có thể được nhìn thấy ... nếu resoult là 15 ... tất cả chúng đã được chạy ... nếu 3 chỉ 1.0 và 2.0, vv ... chế độ nhị phân !!! như trọng lượng bit, vv ... nó chỉ là để hiển thị như thế nào một mã có thể nhận được quá phức tạp ... chỉ vì một chức năng quá tải phải có params khác nhau ...

Điều này là không được phép, vì trình biên dịch không biết một để gọi:

interface 
     function MyFunc(Value:Double):Integer;overload; 
     function MyFunc(Value:Double):Real48;overload; 
     function MyFunc(Value:Double):Real;overload; 
     function MyFunc(Value:Double):Double;overload; 

Vâng, trình biên dịch là một khá ngu ngốc ... nó có thể được biên dịch chỉ trong trường hợp MyFunc được sử dụng trên một assigment .... se mã này:

MyVarOfTypeReal48:=MyFunc(1); // It can know return value must be Real48, so call that one... but compiler is not so Intelligent 

Trong những trường hợp như vậy, có thể biết ai sẽ gọi .... vấn đề là:

MyVarOfTypeInteger:=Round(5*MyFunc(1)+MyFunc(2)*1.3); // This is problematic, first one could be understod as Integer version, second one as ... as what? Real, Real48 or Double? not possible to know... that is why compiler does not like such overloaded (with same arguments). 

Hy vọng điều này sẽ hữu ích!

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