2010-10-14 14 views

Odpowiedz

8

i * 1.0 powinien przekonwertować go na liczbę zmiennoprzecinkową. Wszelkie obliczenia z liczbami zmiennoprzecinkowymi dowolnego typu są niejawnie konwertowane na extendend, a następnie niejawnie przekształcane na pożądany typ wyniku podczas przypisywania. W przeciwieństwie do C/C++ wszystkie obliczenia występują w rozszerzeniu (80-bitowy zmiennoprzecinkowy, wewnętrzny format jednostki zmiennoprzecinkowej x87) i są później przekształcane.

prawdziwy (i) może również działać.

+0

Chciałbym to na odwrót. – Aftershock

2

można zrobić:

myFloat := myInteger; 
+0

Ta typografia jest nieprawidłowa: E2089 Nieprawidłowy typ danych. –

1

3 możliwe sposoby, w zależności od rodzaju wyrażeń masz.

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. 

wyjściowa:

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

Najpierw a +1, a następnie -1; Chciałbym motywacji dla obu: pomaga mi pisać lepsze odpowiedzi. –

4

Integer na Float

Nie ma potrzeby, aby rzucić wszystko, po prostu przypisać

Float1 := Integer1; 

swoje pytanie wydaje się być Float na Integer

Dwie opcje

Integer1 := Trunc(Float1); //truncate 

lub

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

Przeciwieństwem Trunc() jest faktycznie Ceil(). Trunc() zaokrągli w kierunku zera, Ceil() zaokrągli albo w stronę + nieskończoności (jeśli jest liczbą dodatnią), albo - nieskończoności (jeśli jest ujemna). – Trinidad

+3

Żaden Ceil zawsze będzie zaokrąglał się do + inf, Podłoga zawsze będzie zaokrąglana do -inf, a Trunc zawsze do 0. Więc przeciwieństwem Ceil() nie jest Trunc, ale Piętro. – CodesInChaos

+0

Tak, masz rację =) Przepraszamy. – Trinidad

1

mam to dwa (mam więcej, ale na przykład byłby wystarczający) oveloaded funkcje:

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; 

Jak można w typecast Integer na osobowy ? Nienawidzę wkładania "(1,0 * Wartość)" lub "(0.0 + Wartość)", który zużywa mniej czasu procesora, musi istnieć inny sposób, aby to zrobić.

UWAGA: mam na myśli typecast na tym telefonie !!! UWAGA: połączenie jest na przeciążonej funkcji, jeden nazywa druga

nadzieję, że ktoś znajdzie sposób, bo oddanie'MyFunc ((double) wartość) mówi nieważne typecast ... dlaczego w piekle oddające liczbę całkowitą podwójne nie jest możliwe ???? double może przechowywać liczbę całkowitą ... także więcej, gdy przypisując ją, rzutuje ją bezpośrednio ...'MyVarOfTypeDouble: = MyvarOfTypeInteger; 'działa idealnie.

Problemem jest wyposażony w funkcje przeciążenia ... nie wiem chcę zadzwonić do podwójnego wersji jednej ... dlatego potrzebna jest obsada ...

Innymi słowy będzie to ... działa jak czar:

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; 

See, jeśli funkcje nazwy są różne, nie ma potrzeby, aby rzucić ... aż znalazłem lepsze rozwiązanie muszę się obawiać, że będę używać "(0,0 + Value)", gdzie powinien działać (ale nie) "(Double) value", whe Wartość jest typu Integer.

Moja odpowiedź brzmi ...zamiast umieszczać kod "(Double) SomethingOfTypeInteger' (to powinno działać, ale kompilator go nie lubi) ... umieścić ten inny kod" (0.0 + SomethingOfTypeInteger) ", nie polecam używać" (1.0 * SomethingOfTypeInteger) ", ponieważ jest znacznie mniej wydajny ...

kiedykolwiek Nigdy nie myśleć o tworzeniu funkcję jak ten (jest to również najgorszy niż 1,0 * wartość):

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

funkcja ta jest zgodna super ... ale zajmuje dużo , dużo więcej czasu niż wprowadzenie wartości "0.0 + wartość".

teraz bardzo, bardzo ... dużo bardzo inteligentni ludzie ... zobacz to (bardzo brzydki) kod:

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; 

Teraz spróbuj odgadnąć wartości ... kod czytanie nie jest jasne, co połączenia muszą iść ... przekazuję liczbę całkowitą, a następnie w wersji Integer oveload ... która nazywa się ... Real48 przeciążona lub Real jedna lub podwójna? ... to samo dotyczy przekazywania Real48, a także przekazywania Real ...

Kompilator nie znalazł żadnego błędu ... ale nie wiem, który (jeśli tylko jeden) zostanie wywołany ... bez śledzenia, oczywiście!!! czy możesz?

W takich sytuacjach, gdzie Explicit obsada byłoby idealne do pracy ...

Uwaga kładę 1.0+, 2.0+, 4.0+, 8.0+ ... potęgi 2 ... więc jakakolwiek suma niektórych lub niektórych z nich można zobaczyć ... jeśli resoult ma 15 ... wszystkie z nich zostały uruchomione ... jeśli 3 tylko 1.0 i 2.0, itd ... tryb binarny !!! jak bity wagi, itp ... to tylko pokazać, jak kod może stać się zbyt skomplikowany ... tylko dlatego, że przeciążona funkcja musi mieć różne parametry ...

To nie jest dozwolone, ponieważ kompilator nie wie, który jeden zadzwonić:

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; 

Tak, kompilator jest dość głupie ... to może być zestawiane tylko w przypadkach, gdy MojaFunkcja jest używane na assigment .... se ten kod:

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

W takich przypadkach można wiedzieć, do kogo należy zadzwonić .... problem dotyczy:

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). 

Mam nadzieję, że to pomoże!

Powiązane problemy