2010-01-03 4 views
4

J'essaie d'afficher le temps d'exposition EXIF ​​en fraction de seconde mais je n'obtiens pas le résultat attendu, probablement une petite erreur.Calcul du temps d'exposition EXIF ​​en fraction (Delphi)

J'ai trouvé deux routines qui font le calcul mais qui apportent des résultats différents et faux.

La valeur que je rencontre est: "0.0806451612903226" la valeur est de type étendu.

DecimalToFractStr me donner: "16129/200000" en conséquence, DecToFrac me donne: "5/62" à la suite

Résultat attendu devrait être "1/12", puisque tout le monde est ce (ce que est l'astuce). Lorsque je clique avec le bouton droit de la souris sur l'image dans l'explorateur et affiche les détails, j'obtiens cette valeur. Comment l'obtenir dans ma demande? J'espère que quelqu'un peut m'aider ici.

Cordialement Roy M Klever

RESOUDRE! Ok après quelques tests, je l'ai compris. En utilisant le résultat de DecToFrac, ils le divisent simplement en entier avec le résultat du côté gauche. 5 div 5 = 1/62 div 5 = 12 donc je suis parti avec le résultat voulu 1/12.

Merci pour votre contribution.

Cordialement Roy M Klever

procedure DecimalToFract(value: double; AllowedDecimals: integer; var num, den: 
    integer); 
var 
    d, i: integer; 
    ex: boolean; 
begin 
    d := Trunc(power(10, AllowedDecimals)); 
    num := Trunc(value * d); 
    den := d; 
    repeat 
    ex := true; 
    for i := 10 downto 2 do 
     if ((num mod i) = 0) and ((den mod i) = 0) then 
     begin 
     num := num div i; 
     den := den div i; 
     ex := false; 
     end; 
    until ex; 
end; 

function DecimalToFractStr(value: double): string; 
var 
    num, den: integer; 
begin 
    DecimalToFract(value, 6, num, den); 
    if den = 1 then 
    result := inttostr(num) 
    else 
    result := inttostr(num) + '/' + inttostr(den); 
end; 

function Dec2Frac(f: Double): String; 
var 
    df: Double; 
    lUpperPart: Integer; 
    lLowerPart: Integer; 
begin 
    lUpperPart := 1; 
    lLowerPart := 1; 
    df := lUpperPart/lLowerPart; 
    While (df <> f) do 
    begin 
    If (df < f) Then 
     lUpperPart := lUpperPart + 1 
    Else 
    begin 
     lLowerPart := lLowerPart + 1; 
     lUpperPart := Trunc(f * lLowerPart); 
    end; 
    df := lUpperPart/lLowerPart; 
    end; 
    if lLowerPart = 1 then 
    result := IntToStr(lUpperPart) 
    else 
    result := IntToStr(lUpperPart) + '/' + IntToStr(lLowerPart); 
end; 

Répondre

1

Je ne peux pas dire à la lecture de votre code, mais je me demande si vous avez des problèmes en raison d'une application erronée de la division entière quelque part.

Si vous êtes certain que 1/12 = 0,0833333333 ..... est la réponse que vous devriez obtenir, tous les résultats que vous avez signalé sont incorrects:

La valeur que j'ai problème est: "0.0806451612903226" La valeur est de type Extended.

DecimalToFractStr me donner: "16129/200000" en conséquence, DecToFrac me donne: "5/62" à la suite

Tous les trois ont tort.

Je m'attendais à voir quelque chose de plus le long des lignes de greatest common divisor une fois que vous avez exprimé votre valeur en tant que ratio de deux nombres entiers.

+0

Je vois ce que vous voulez dire. Je me demande simplement comment les autres obtiennent le résultat, peut-être arrondi quelque part ... Je veux seulement pouvoir afficher la même valeur que les autres logiciels, donc j'ai besoin de trouver une solution. J'ai donné ce que j'ai de données, avez-vous une idée de la façon dont ils arrivent au résultat "1/12"? –

+0

"Autres"? Est-ce un devoir? Ils ne doivent pas être codés de la même façon que vous. Je n'ai pas creusé dans votre code pour comprendre ce que vous faites, mais ce n'est pas simple. – duffymo

+0

Non, avec d'autres, je veux dire des applications capables d'afficher des données EXIF ​​et donnant la valeur "1/12" comme résultat. Eh bien, j'essaie de comprendre comment ils le font ... Si je dois faire d'autres calculs, ça me convient mais j'ai besoin d'un peu d'aide pour ce que je devrais rechercher. –

3

Peut-être qu'ils ont dur codé les temps d'exposition communs et ils choisissent le plus proche?

4

1/12 n'est pas réellement un résultat correct pour cette valeur. Peut-être qu'ils ont peut-être une sorte de table de recherche "snap to", c'est-à-dire que cette valeur est la plus proche de 1/12 d'une liste de valeurs incrémentées?

+0

La troncature est en cause. Il n'y a aucune information sur le nombre de décimales qu'il a choisi de conserver. – duffymo

0

RÉSOLU! Ok après quelques tests je l'ai compris. En utilisant le résultat de DecToFrac, ils le divisent simplement en entier avec le résultat du côté gauche. 5 div 5 = 1/62 div 5 = 12 donc je suis parti avec le résultat voulu 1/12.

Merci pour votre contribution.

Cordialement Roy M Klever