Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi zehnerpotenzen (https://www.delphipraxis.net/66673-zehnerpotenzen.html)

Nicodius 2. Apr 2006 15:28


zehnerpotenzen
 
ich hab mir eine physik unit geschrieben die eben auch in 10er potenzen umrechnen soll

ich hab mal die negativen 10er potenzen zeurst gemacht





Delphi-Quellcode:
function TPhysic.Potenz10(z: real; nr : Integer): String;
var help, hs : String;
    i,e,s,stellen : Integer;
    b : boolean;
begin
{ aufbau zB 0.000021 ergebnis : 2.1*10^-5
  nr = genauigkeit}
  help := floatToStr(z);
  s := 3;
  if nr > Length(help)-1 then nr := nr - Length(help)-1;
  hs := '';
  stellen := 0;
  b := false;
  if (help[1] = '0') and (help[2] = ',') then
  begin
    for i:= 3 to length(help)-1 do
    begin s := s + 1;
        if b = false then
      if help[i] <> '0' then
      begin
        b := true;
        hs := help[i] + ',';
        for e := s to length(help)-1 do
          hs := hs + help[e];
      end
      else
          inc(stellen);
    delete(hs,2+nr,length(hs)-(2+nr));
    result := hs + '*10^-' + IntToStr(Stellen+1)
    end;
  end
  else
  begin

  end;
end;
nr stellt eben die genauigkeit ein und genau da ist mein problem

aufruf :

Delphi-Quellcode:
  Edit1.Text := p.Potenz10(StrToFloat(Edit1.text),2);

lösungen von zwei eingaben :

0,05634
5,63*10^-2 <-- das stimmt

0,000345
3,4*10^-4 <-- das stimmt nicht


jemand eine ahnung wos happert(ist unsauber geschrieben bitte verzeiht)


grüße Nico

leddl 2. Apr 2006 15:54

Re: zehnerpotenzen
 
Servus!

Zeile 23
Delphi-Quellcode:
for e := s to length(help)-1 do
  hs := hs + help[e];
ist so nicht korrekt. Dadurch schneidest du das letzte Zeichen deiner Zahl sozusagen ab.
Immer dran denken: Strings sind 1-basiert, nicht 0-basiert. ;)

Mit
Delphi-Quellcode:
for e := s to length(help) do
  hs := hs + help[e];
sollte es eigentlich funktionieren. (habs jetzt allerdings nicht getestet)

Nicodius 2. Apr 2006 16:06

Re: zehnerpotenzen
 
vielen herzlichen dank - es klappt :)

grüße Nico

leddl 2. Apr 2006 16:08

Re: zehnerpotenzen
 
Kein Problem! Sowas kann passieren. Bin da grad auch nur durch Zufall drüber gestolpert :lol:

Basilikum 2. Apr 2006 16:35

Re: zehnerpotenzen
 
Zitat:

Zitat von Nicodius
ich hab mir eine physik unit geschrieben die eben auch in 10er potenzen umrechnen soll

ich hab mal die negativen 10er potenzen zeurst gemacht

Delphi-Quellcode:
function TPhysic.Potenz10(z: real; nr : Integer): String;

huch, da stehen mir ja sämtliche Haare rechtwinklig vom Kopf ab, bei diesem Umweg über Strings...

ich würde etwas in diese Richtung vorschlagen:
Delphi-Quellcode:
Function EngineerFormat(Const F : Double;Const Digits : Byte) : String;
Var
  P : Integer;
Begin
  If (Abs(F) > 0.0) Then P:=Trunc(Log10(F) + 500) - 500 Else P:=0;

  Result:=Format('%s*10^%d',[FloatToStrF(F / Power(10,P),ffFixed,15,Digits - 1),P]);
end;

Nicodius 2. Apr 2006 16:41

Re: zehnerpotenzen
 
mit Verlaub : jetzt stehen mir aber die haare weg :mrgreen:

bitte erklär mir ich mags verstehen ;)

danke aber vielmals scheint ja weniger aufwand zu sein aber wies funktioniet würd ich gerne wissen ;)

3_of_8 2. Apr 2006 16:50

Re: zehnerpotenzen
 
Wenn gilt 10^x=y, dann gilt x=log10(y).

Die Zahl x ist ja gesucht. Verstanden?

Nicodius 2. Apr 2006 16:53

Re: zehnerpotenzen
 
ja jetzt schon viel besser - danke :zwinker:

Basilikum 2. Apr 2006 16:56

Re: zehnerpotenzen
 
Log ist die mathematische Umkehrfunktion zur Potenz...

Log10 (also zur Basis 10) ist die inverse Operation zur Potenz von 10

LogN( N^P ) = P
Log10( 10^P ) = P

10^3 = 1000
Log10(1000) = 3

10^-4 = 0.0001
Log(0.0001) = -4

bei "Zerquetschen" sind die Zahlen etwas weniger schön:

10^1.5 = ~31.6
Log10(31.6) = ~1.5


=> so lässt sich relativ bequem feststellen, um wie viele Dezimal-Stellen eine Zahl geschoben (mit 10 multipliziert/dividiert) werden muss, damit genau eine Stelle vor dem Komma stehen bleibt - dieses Verschieben wird mit dem Dividieren durch Power(10,P) (= 10^P) bewerkstelligt

der "Murks" mit dem Trunc(x + 500) - 500 ist dazu da, dass IMMER abgerundet wird (aus -4.2 mach -5), Trunc "rundet" normalerweise gegen 0 (aus -4.2 wird -4)


PS: ich hoffe, dies war einigermassen verständlich

PPS: da ich jetzt sooo lange geschrieben habe, sende ich es trotz rotem Kasten ab :-)

Nicodius 2. Apr 2006 17:07

Re: zehnerpotenzen
 
danke vielmals ;)

prima ne stunde meines lebens wieder an ner völlig dummen lösung verbraten :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz