Geometrik ortalama hesabı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
tanerileri

Geometrik ortalama hesabı

Mesaj gönderen tanerileri »

geometrik ortalam hesabı delphide hazır bir function olarak varmıdır ?
veya bunu nerden bulabilirim.

Hesap şu : 10000,30000,40000,20000,50000 değerlerimiz var.
Bu değerlerin geometrik ortalaması şu şekilde hesaplanır.

(10000*30000*40000*20000*50000) çarpımları alınır , bunun 5 inci dereceden kökünü aldığımızda geometrik ortalamasının almmış oluruz.

Delphide kod ile yapmaya çalıştım ama , taşma hatası oldu , kısa bir yolu olabilmeli diye düşünüyorum. Log vs gibi.

Teşekkürler.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Delphi Help'te Statistical routines kısmına bir bak. Var mı tam emin olamadım.

Kolay gelsin.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Bildiğim kadarıyla yok.

Matematiği de unutmuşuz kullanmaya kullanmaya.

Bunu 3 elemanlı bir hesap için X*Y*Z üzeri 1/3 olarak yazabilir miyiz?
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Şöyle bir kod yazdım.

Kod: Tümünü seç

function GeometrikOrtalama(const Values: array of Single): Single;
var
  Index: Integer;
begin
  // Başlangıç değeri çarpımı etkilememek için 1'e eşitlenir
  Result:= 1;
  // Open array parametre kullandığımızdan istediğimiz kadar
  // değeri parametre olarak geçebiliriz.
  // Çarpımlar hesaplanır
  for Index:= 0 to High(Values) do
    Result:= Result * Values[Index];
  // Eleman sayısı kadar kökü alınır
  Result:= Power(Result, 1 / (High(Values) + 1));
end;
Kullanımı:

Kod: Tümünü seç

GeometrikOrtalama([44.2, 23.3, 33.1, .......]);
Kolay gelsin.
En son fduman tarafından 17 Mar 2005 03:17 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Verdiğin örneğin geo. ort. 26051,7109375 çıkıyorsa bu kod işini görür.
tanerileri

Formülünüz doğru fakat

Mesaj gönderen tanerileri »

sayılar 5-6 tane değil , 50 tane bile olabiliyor , bu sebeple çarpım çok büyük oluyor ve taşma hatasına sebep oluyorr.

http://bilgi.umedia.org.tr/yayin/tejm/i ... #geometrik

adresindeki kısma bakabilirseniz , Log olarak da hesaplanabilir diyor fakat ben LOG konusuna hiç hakim değilim.
bu konuda yardımcı olabilirmisiniz.

teşekkürler
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Kodumda single yaptığım veri tiplerinin hepsini Extended yapın. Bu şekilde epey bir sayıyı hesaplatabildim.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Bu daha güzel bir formül.

Kodu logaritmik formule göre değiştirirsek:

Kod: Tümünü seç

function GeometrikOrtalama(const Values: array of Extended): Extended;
var
  Index: Integer;
begin
  // Başlangıç değeri toplamı etkilememek için 0'a eşitlenir
  Result:= 0;
  // Logaritmik toplamlar hesaplanır.
  for Index:= 0 to High(Values) do
    Result:= Result + (Log10(Values[Index]) / (High(Values) + 1));
  // Ters logaritması alınır.
  Result:= Power(10, Result);
end;
tanerileri

Mesaj gönderen tanerileri »

Çok teşekkür ederim. Ben ilk denememde Real vermiştim , bu yüzden taşmış sanırım.

Ayrıca soruma cevap veren bütün herkese , duyarlılıkları için teşekkür ederim.

Saygılar.
Cevapla