Arama butonu
Bu konudaki kullanıcılar: 4 misafir, 3 mobil kullanıcı
4171
Cevap
168309
Tıklama
3
Öne Çıkarma
Cevap: C/C++/C# Sorularınız Buraya. . .(GÜNCEL) (37. sayfa)
G
13 yıl
Yüzbaşı

quote:

Orijinalden alıntı: mertov

quote:

Orijinalden alıntı: garui

quote:

Orijinalden alıntı: mertov
Ya aslında o aklıma geldi de sonra dedim ki kelvin ve celcius için doğru değer veriyor fahrenheit için neden vermesin? Dediğiniz gibi yaptım şimdi tamamen düzgün çalışıyor teşekkürler

Rica ederim :) Yukarıda basamaktan sonra iki hanesi yazmışım. Pardon. Noktadan sonra iki hane olacaktı. Yanlış yazmışım.

Hocam bu value=fah ile fah=value olayı kafama tam yatmadı şimdi yaptığım kural olarak yanlış bilinmeyeni sol tarafa bilineni sağ tarafa yazmalıyım tamam ama value=cel ve value=kel yazdığımda sonuçlar neden doğru çıkıyor? Dediğinizi kısmen anladım value'den değer almak yerine ben value'ye değer veriyo gibi oluyorum diye düşünüyorum :)

Her değer için mi doğru çıkıyor :) 20 25 45 vererek 3 kere çalıştır programı. Bakalım hepsinde doğru mu gelecek.

cel=value; --> value değerini cel değerine ata demektir.

1=cel ile cel=1 farklıdır. Hatta ilkinde compiler hata verir :)



G
13 yıl
Yüzbaşı

quote:

Orijinalden alıntı: Full#Throttle

C++ kodlarını C'ye çevirebilecek bir eklenti gibi birşey var mıdır acaba?

#include <iostream> 

using namespace std;

int main() {
long double a=1,b=1,d=0,n,e,m=1;
long double c=0;
cout<<"n giriniz: "<<endl;

cin>>n;

while(m<=n){
a=1;
b=1;

for(int i=1; i<=m; i++)
a=a*i;

for(int j=1; j<=2*m+1; j++)
b=b*j;

c=a/b;
cout<<"a: "<<a<<"\nb: "<<b<<endl;
d=d+c;
cout<<d<<endl;
m++;
}
cout<<d;
}


Bunu C kodu olarak çalıştıramıyorum. Printf ve scanf leri düzeltip attığımda forlarda hata alıyorum.

 
#include <stdio.h>

int main() {
long double a=1,b=1,d=0,n,e,m=1,c=0;
printf("n giriniz: \n");
scanf("%Ld", &n);

while(m<=n){
a=1; b=1;
int i,j;
for(i=1; i<=m; i++) { a*=i; }
for(j=1; j<=2*m+1; j++) { b*=j; }

c=a/b;
printf("a: %Ld\nb: %Ld\n",a ,b);
d=d+c;
printf("d(temp): %Ld\n",d);
m++;
}
printf("d(result): %Ld\n",d);
return 0;
}





< Bu mesaj bu kişi tarafından değiştirildi garui -- 11 Kasım 2012; 20:55:05 >
Bu mesaja 1 cevap geldi.
G
13 yıl
Yarbay

quote:

Orijinalden alıntı: garui

quote:

Orijinalden alıntı: strahd_von_zarovich

quote:

Orijinalden alıntı: Roxy.

quote:

Orijinalden alıntı: strahd_von_zarovich

Biraz garip olacak ama long int ile int niye aynı kapasitede sayı tutuyor . Ve unsigned int e mesela -2 verdiğimde değeri neden +4,294,967,294 oluyor ?

adından da anlaşılacağı gibi unsigned, yani işaretsiz, sadece işaretsiz değerler girilebilir. yine de işaretli değer girilebilir, eğer işaretli bir değer girilirse derleyici bu değeri alır ve belirli bir kurala göre başka bir değer aktarır. derleyiciden derleyiciye farklılık gösterebilir.

İnt in değeri derleyiciden derleyiciye farklılık gösterebiliyor ama , - nin işlenmesi aynı anladığım kadarıyla. int kaç bitlikse bende mesela 32 bit -3 gibi bir değer verildiğinde 2^32-3 değerini alıyor ama nedenini çözemedim.


unsigned int niye int in yaklaşık 2 katı pozitif değer alır diye düşünmekle başla. Data Type Ranges

int 32 bit tanımlanır. Negatif ve Pozitiflik MSB(Most Significant Bit) -yani 32. bit diyebiliriz - bitinde tutulur.

8 bitlik bi sayı ile anlatıyım. Memoryde aşağıdaki gibi tutulduklarını düşün.
00000011 = signed 3 = unsigned 3
11111101 = signed -3 = unsigned 253

Şimdi sen -3 diyince unsigned int değişkene 11111101 değerini atıyorsun. unsigned int için bu değer 253 demek. Eğerki biz 11111101 memory bloğuna bu aslında int deseydik bilgisayar bu sayıyı int olarak ele alıcak. Bakıcak MSB 1 yani bu sayı negatif. Üstinde 2's complement uyguluycak (1's complement +1) bu sayının negatif değerini bulmak için. Sonuç 00000010 + 1 = 00000011 = 3 ama negatif yani -3.
Daha fazla açıklama için 2's complement wiki sayfası --> Two's Complement

Neden böyle bir yöntem ile sayıların memory üzerinde tutulduğunu soruyorsan Wiki sayfasında da belirtilmiş. Çoğu matematik işlem üzerlerinde direk uygulanabiliniyor.

Örnek :

-3 + 5 = 11111101 + 00000101 = 100000010 (9.bit 8bit memory üstünde işlem yaptığımızdan Carry Bit olarak algılanacak.) Elimizde 8 bit olarak memoryde 00000010 var. Sonuç : 2.
-3 + 2 = 11111101 + 00000010 = 11111111 (Sonuç 8 bit. Carry Bit taşması yok.) Sonuç : MSB'e bakıyoruz 1 yani sonuç negatif. 11111111 -> (2's complement) -> 00000000 + 1 = 00000001. Yani -1.

Basit olarak şöyle diyebiliriz. Sayıların bellekteki görünümleri aynı olsa bile işaretli ve işaretsiz olarak yorumlanmaları farklıdır. Mesela 1111 1110 verisine signed char üzerinden erişirsek -2, unsigned char üzerinden erişirsek 254 sonucunu alırız.

union {
char a;
unsigned char b;
};
b = 200;

printf("b = %d\n", b); // 200
printf("a = %d\n", a); // -56
İki sayıda binary olarak aynı olsada yorumlanmaları farklı. Bir diğer konu da pointerlar.

char* bptr = (char*) &b;
printf("b = %d\n", *bptr); // -56

b içindeki veriye signed (char) olarak erişildiğinden -56 elde edildi.



F
13 yıl
Yarbay

quote:

Orijinalden alıntı: garui

quote:

Orijinalden alıntı: Full#Throttle

C++ kodlarını C'ye çevirebilecek bir eklenti gibi birşey var mıdır acaba?

#include <iostream> 

using namespace std;

int main() {
long double a=1,b=1,d=0,n,e,m=1;
long double c=0;
cout<<"n giriniz: "<<endl;

cin>>n;

while(m<=n){
a=1;
b=1;

for(int i=1; i<=m; i++)
a=a*i;

for(int j=1; j<=2*m+1; j++)
b=b*j;

c=a/b;
cout<<"a: "<<a<<"\nb: "<<b<<endl;
d=d+c;
cout<<d<<endl;
m++;
}
cout<<d;
}


Bunu C kodu olarak çalıştıramıyorum. Printf ve scanf leri düzeltip attığımda forlarda hata alıyorum.

 
#include <stdio.h>

int main() {
long double a=1,b=1,d=0,n,e,m=1,c=0;
printf("n giriniz: \n");
scanf("%Ld", &n);

while(m<=n){
a=1; b=1;
int i,j;
for(i=1; i<=m; i++) { a*=i; }
for(j=1; j<=2*m+1; j++) { b*=j; }

c=a/b;
printf("a: %Ld\nb: %Ld\n",a ,b);
d=d+c;
printf("d(temp): %Ld\n",d);
m++;
}
printf("d(result): %Ld\n",d);
return 0;
}


Teşekkür ederim.



J
13 yıl
Binbaşı

merhabalar ben h.tepede 1. sınıftayım hocamız bize kendi kütüphanenizi oluşturun dedi ben codeblcks kullanıyorum
program hakkında bilginiz var mı bir de kütüphaneyi nasıl oluşturacağım?


Bu mesaja 1 cevap geldi.
G
13 yıl
Yüzbaşı

quote:

Orijinalden alıntı: jervis

merhabalar ben h.tepede 1. sınıftayım hocamız bize kendi kütüphanenizi oluşturun dedi ben codeblcks kullanıyorum
program hakkında bilginiz var mı bir de kütüphaneyi nasıl oluşturacağım?

Hocan sadece bu kadar dediyse,

http://stackoverflow.com/questions/42770/writing-using-c-libraries

içine bir de,

#ifndef __myCuteLibrary
#define __myCuteLibrary
.
.
.
.
.
.
#endif

yaparsın tamamdır.

Bir de buna benzer class için yaparsın. C++ olur.

http://en.wikipedia.org/wiki/Library_(computing) --> Static linking, dynamic linking vs...





< Bu mesaj bu kişi tarafından değiştirildi garui -- 12 Kasım 2012; 0:46:42 >
Bu mesaja 1 cevap geldi.
J
13 yıl
Binbaşı

quote:

Orijinalden alıntı: garui

quote:

Orijinalden alıntı: jervis

merhabalar ben h.tepede 1. sınıftayım hocamız bize kendi kütüphanenizi oluşturun dedi ben codeblcks kullanıyorum
program hakkında bilginiz var mı bir de kütüphaneyi nasıl oluşturacağım?

Hocan sadece bu kadar dediyse,

http://stackoverflow.com/questions/42770/writing-using-c-libraries

içine bir de,

#ifndef __myCuteLibrary
#define __myCuteLibrary
.
.
.
.
.
.
#endif

yaparsın tamamdır.

Bir de buna benzer class için yaparsın. C++ olur.

http://en.wikipedia.org/wiki/Library_(computing) --> Static linking, dynamic linking vs...

teşekkür ederim..


Bu mesaja 1 cevap geldi.
U
13 yıl
Teğmen

merhaba arkadaşlar, sorum şu;
rastgele değerler alacak 10 elamanlı dizide tek sayıları başa çift sayıları sona yazacak programı c++ta yapacağım. rastgele 10 sayıyı yazdırabiliyorum ama bunların tek olanları başa çift olanları sona yazdıramıyorum.

kodun son hali bu şekilde;

#include<stdio.h> 
#include<stdlib.h>
#include<time.h>
int main()
{
int a[10];

srand(time(0));
for(int i=0;i<10;i++)
a[i] =rand()%100;


for(int i=0;i<10;i++)
{
printf("%d\n",a[i]);
}

printf("\n\n\n");

for(int i=0;i<10;i++)
{

if(a[i]%2!=0)
printf("%d\n" ,a[i]);

else
????????

}





system("pause");


}


Bu mesaja 1 cevap geldi.
G
13 yıl
Yüzbaşı

quote:

Orijinalden alıntı: uykusu gelen adam

merhaba arkadaşlar, sorum şu;
rastgele değerler alacak 10 elamanlı dizide tek sayıları başa çift sayıları sona yazacak programı c++ta yapacağım. rastgele 10 sayıyı yazdırabiliyorum ama bunların tek olanları başa çift olanları sona yazdıramıyorum.

kodun son hali bu şekilde;

#include<stdio.h> 
#include<stdlib.h>
#include<time.h>
int main()
{
int a[10];

srand(time(0));
for(int i=0;i<10;i++)
a[i] =rand()%100;


for(int i=0;i<10;i++)
{
printf("%d\n",a[i]);
}

printf("\n\n\n");

for(int i=0;i<10;i++)
{

if(a[i]%2!=0)
printf("%d\n" ,a[i]);

else
????????

}





system("pause");


}


Istersen bundan yararlanabilirsin. QuickSort Modifikasyonu. Ben biraz modifiye ettim hesaplamalarin ustunde fazla durmadan. Cok daha kolay olara bu is yapilir mi ? Evet tabiki yapilir. Ama bilgi olur sana.

QuickSort -->http://login2win.blogspot.com/2011/06/what-is-quick-sort-algorithm-how-to.html

 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define INPUT_SIZE 10

void print(int *input)
{
for ( int i = 0; i < INPUT_SIZE; i++ )
printf("%d ", input[i]);
printf("\n");
}

// The partition function
int partition(int* input, int p, int r)
{
while (p < r)
{
while ( input[p]%2 == 0 )
p++;

while ( input[r]%2 != 0 )
r--;

if( p < r)
{
int tmp = input[p];
input[p] = input[r];
input[r] = tmp;
}
}

return r;
}

// The quicksort recursive function modification for odd even
void quicksort(int* input, int p, int r)
{
if ( p < r )
{
int j = partition(input, p, r);
if( j > p) {
quicksort(input, p, j-1);
quicksort(input, j+1, r);
}
}
}

int main()
{
int myInput[INPUT_SIZE];

srand(time(0));
for(int i=0;i<INPUT_SIZE;i++)
myInput[i] =rand()%100;

print(myInput);

quicksort(myInput, 0,(INPUT_SIZE -1));

print(myInput);

system("pause");
return 0;
}


Output: #define INPUT_SIZE 10

91 22 45 94 93 48 74 20 67 64
64 22 20 94 74 48 93 45 67 91

Output: #define INPUT_SIZE 30

74 6 46 20 16 93 19 80 69 16 19 31 48 21 27 63 2 80 74 2 6 42 17 58 98 50 13 40 4 73
74 6 46 20 16 4 40 80 50 16 98 58 48 42 6 2 2 80 74 63 27 21 17 31 19 69 13 19 93 73





< Bu mesaj bu kişi tarafından değiştirildi garui -- 13 Kasım 2012; 15:38:46 >
Bu mesaja 1 cevap geldi.
N
13 yıl
Yüzbaşı

C# da kullanıcı 5a+6b gibi bir değer girdiğinde buradaki değerleri nasıl ayrıştabilirim?
Örneğin a kısmı = 5 gibi


Bu mesaja 1 cevap geldi.
G
13 yıl
Yüzbaşı

quote:

Orijinalden alıntı: Naples

C# da kullanıcı 5a+6b gibi bir değer girdiğinde buradaki değerleri nasıl ayrıştabilirim?
Örneğin a kısmı = 5 gibi

Regex isini gorur gibi geliyor.

http://oreilly.com/windows/archive/csharp-regular-expressions.html


Bu mesaja 1 cevap geldi.
F
13 yıl
Onbaşı

dev c++ programında en basıt program denemesnde bıle

C:\Dev-Cpp\Yeni klasör\Makefile.win [Build Error] [Praoje1.exe] Error 1 hatasını verıyor acıl yardım edebılırmsınz?



B
13 yıl
Teğmen

arkadaslar;

program kullanıcı -1 girene kadar girdiği sayıların arasından en buyuk olanı secıp -1 girdiğinde yazıcak. Bu programın C++ da kodunu veya algoritmasını yazarmısınız.

edit: Tamam çözdüm gerek kalmadı.





< Bu mesaj bu kişi tarafından değiştirildi basaran747 -- 13 Kasım 2012; 23:01:36 >

-
13 yıl
Yüzbaşı

Arkadaşlar vizem var C++ bilenler varsa bunları cevaplandırabilirse çok iyi olur.

1)Bir işçi saat ücreti olarak 10 YTL almaktadır. Ayrıca yemek ve yol yardımı olarak 10 YTL almaktadır. Ayda %8 oranında sigorta kesintileri olmaktadır. Ekrandan girilen aylık çalışma saatine göre isçinin kesintilerden sonra eline gecen aylık parayı hesaplayan algoritmanın C++ kodunu yazın.

2)Kullanıcının girdiği iki değerin ikincisi birincisinin üssü olacak şekilde hesaplayan kendini çağıran (recursive veya for kullanarak) bir fonksiyon yazınız.
Örneğin: Kullanıcı 2 ve 3 girdi, program 2 üzeri 3 ü hesaplayacak.

3)Program kullanıcından 4 rakamdan oluşan bir tamsayı istesin. Alınan bu değerin rakamlarını bir birinden ayıran ve ekranda gösteren bir fonksiyon yazınız.
Örneğin: Kullanıcı 1234 girdiğini kabul edelim. Program ekrana “Girdiğiniz sayı 1, 2, 3 ve 5 rakamlarından oluşuyor” yazsın.

edit: çalıştırmak için dev c++ kullanılıcak.





< Bu mesaj bu kişi tarafından değiştirildi -Apeiron- -- 14 Kasım 2012; 0:01:14 >
Bu mesaja 1 cevap geldi.
S
13 yıl
Binbaşı

quote:

Orijinalden alıntı: darrenjonas

Arkadaşlar vizem var C++ bilenler varsa bunları cevaplandırabilirse çok iyi olur.

1)Bir işçi saat ücreti olarak 10 YTL almaktadır. Ayrıca yemek ve yol yardımı olarak 10 YTL almaktadır. Ayda %8 oranında sigorta kesintileri olmaktadır. Ekrandan girilen aylık çalışma saatine göre isçinin kesintilerden sonra eline gecen aylık parayı hesaplayan algoritmanın C++ kodunu yazın.

2)Kullanıcının girdiği iki değerin ikincisi birincisinin üssü olacak şekilde hesaplayan kendini çağıran (recursive veya for kullanarak) bir fonksiyon yazınız.
Örneğin: Kullanıcı 2 ve 3 girdi, program 2 üzeri 3 ü hesaplayacak.

3)Program kullanıcından 4 rakamdan oluşan bir tamsayı istesin. Alınan bu değerin rakamlarını bir birinden ayıran ve ekranda gösteren bir fonksiyon yazınız.
Örneğin: Kullanıcı 1234 girdiğini kabul edelim. Program ekrana “Girdiğiniz sayı 1, 2, 3 ve 5 rakamlarından oluşuyor” yazsın.

edit: çalıştırmak için dev c++ kullanılıcak.

1.Sadece matematik

2. int sayac,carpim=1,taban,ust; diye degiskenler atadin,

for(sayac=1;sayac<=ust;sayac++)
{
carpim*=taban;
}

3.10 a bölümünden kalan 4 , sayi-4 bölü 100 e bölümünden kalan 3 , diye giden algoritmayı oluşturacaksın.


Bu mesaja 1 cevap geldi.
D
13 yıl
Çavuş

N adet öğrencinin öğrenci numarasını ve sınav sonuçlarını okuyup, okunan bu bilgileri giriş sırasına göre görüntüleyen ve sınav sonuç ortalamasını bulan uygulama aşağıda verilmiştir.  

#include <stdio.h>
void giris(int no[], int not[], int N);
float ortalama(int not[], int N);
void goruntule(int no[], int not[], int N);

void main()
{ int N;
int OgrNo[BUFSIZ], BNotu[BUFSIZ];
float ort;
printf("Ogrenci sayisini giriniz: ");
scanf("%d", &N);
giris(OgrNo, BNotu, N);
goruntule(OgrNo, BNotu, N);
ort = ortalama(BNotu, N);
printf("Not ortalamasi: %5.2f\n", ort);
}

void giris(int no[], int not[], int N)
{
int i;
for (i=0; i<N; i++)
{ printf("Ogrenci no gir: ");
scanf("%d", &no[i]);
printf("%d numarali ogrencinin basari notunu gir : ", no[i]);
scanf("%d", &not[i]);
}
}

void goruntule(int no[], int not[], int N)
{
printf("Ogrenci#\tNotu\n");
for (int i=0; i<N; i++)
printf("%8d\t%3d\n", no[i], not[i]);
}

float ortalama(int not[], int N)
{ float t;
int i;
t = 0;
for (i=0; i<N; i++)
t = t + not[i];
float ort = t / N;
return ort;
}

Yukarıdaki uygulamaya ek olarak;
• PAÜ Öğrenci İşleri Lisans Yönetmeliği gereği öğrenci notlarına ait ortalamanın 50’nin altında olması durumunda ortalamayı 50’ye yükseltmek için uygulamaya öğrenci notlarını öteleyen otele() adlı bir fonksiyon ekleyiniz. goruntule() fonksiyonunu çağırıp ötelenmiş notları ve ortalama() fonksiyonunu çağırıp 50 olması gereken yeni ortalamayı görüntüleyecek şekilde uygulamayı güncelleyin.
• Ötelenmiş notlara göre (ortalamanın 50’nin üzerinde olması durumunda orijinal notlar esas alınacaktır) aşağıda verilen tablo dikkate alınarak başarı notlarının harf notu dağılımlarını yatay histogram şeklinde görüntüleyen fonksiyonu yazınız.
• Ötelenmiş notlara göre (ortalamanın 50’nin üzerinde olması durumunda orijinal notlar esas alınacaktır) aşağıda verilen tablo dikkate alınarak başarı notlarının harf notu dağılımlarını dikey histogram şeklinde görüntüleyen adlı fonksiyonu yazınız.


arkadaşlar sadece dikey histogramı yapamadım yardımcı olabilecek biri var mı?



Başarı notları dağılım aralıkları (dikey histogram):

7 | ** |
6 | ** |
5 | ** ** ** |
4 | ** ** ** ** |
3 | ** ** ** ** |
2 | ** ** ** ** ** ** ** ** ** |
1 | ** ** ** ** ** ** ** ** ** ** |
--+-------------------------------+
A1 A2 B1 B2 C1 C2 B1 B2 E F1

Not: Örnekte 32 adet nota göre dağılım aralıkları gösterilmiştir.

Başarı Not Aralıkları:
90+: A1, 80–89: A2, 75–79: B1, 70–74: B2, 65–69: C1, 60–64:C2, 55–59: D1: 50–54: D2, 40–49: E, 0–39: F



B
13 yıl
Çavuş

Arkadaşlar merhaba

combobox ile sıkıntı var malesef...

bir formum var ve iki tane combobox um var.

combobox1 in koleksiyonunda 1 seçili olduğunda combobox2 de 1,2,3,4,5,6,7,8,9 rakamlarını
combobox1 in koleksiyonunda 2 seçili olduğunda combobox2 de 11,12,13,14,15,16,17,18,19 rakamlarını seçebilmek istiyorum

yani combobox1 deki değişkene göre combobox2 nin içeriği değişsin istiyorum... bunu nasıl sağlarız?


Bu mesaja 2 cevap geldi.
N
13 yıl
Yüzbaşı

Arkadaşlar C# Math trigonometri fonksiyonlarında yardım gerekiyor.

Öncelikle tan 1/kök3=60 derece bunu biliyoruz. Ben bu bölme işlemini yaptırdığımda 1.7320508075688774 bu sonucu buluyorum ve program 1.7320508075688 buraya kadar yazdırıyor.

Math.Tan fonksiyonuyla tan60ı bulmaya çalışınca 1.7320508075688767 bu sonuç çıkıyor ve yine 1.7320508075688 buraya kadar yazdırıyor.
Programımda eğer bu derece bulmaya çalışınca bunlar eşit olmuyor haliyle...
Şimdi bu iki şey yanlış mı? Bize mi yanlış öğretildi ben mi yanlış yapıyorum?

Teşekkürler


Bu mesaja 1 cevap geldi.
G
13 yıl
Yüzbaşı

quote:

Orijinalden alıntı: Naples

Arkadaşlar C# Math trigonometri fonksiyonlarında yardım gerekiyor.

Öncelikle tan 1/kök3=60 derece bunu biliyoruz. Ben bu bölme işlemini yaptırdığımda 1.7320508075688774 bu sonucu buluyorum ve program 1.7320508075688 buraya kadar yazdırıyor.

Math.Tan fonksiyonuyla tan60ı bulmaya çalışınca 1.7320508075688767 bu sonuç çıkıyor ve yine 1.7320508075688 buraya kadar yazdırıyor.
Programımda eğer bu derece bulmaya çalışınca bunlar eşit olmuyor haliyle...
Şimdi bu iki şey yanlış mı? Bize mi yanlış öğretildi ben mi yanlış yapıyorum?

Teşekkürler

Hem doğru hem yanlış yapıyorsun. Kodu görmedim ama sorunun kayar nokta aritmetiği (floating point arithmetic) olduğunu söyleyebilirim. Bunların karşılaştırması == ile ancak değerler üzerinde işlem yapılmadıysa mümnkündür. Herhangi bir aritmetik işlem uygulandığı anda ortalık karışır :) (1.0/10.0 == 0.1)(false) diyebiliriz ama (0.1 == 0.1)(true) dur..

http://www.codeproject.com/Articles/16646/Reliable-Floating-Point-Equality-Comparison

http://csharp.2000things.com/tag/epsilon/

İşin içinde daha fazlası var diyebilirim. Hesaplamalardan gelecek değerlere göre mesela 2. linkteki EPILSON değeri işe yaramayabilir.


Bu mesaja 1 cevap geldi.
N
13 yıl
Yüzbaşı

quote:

Orijinalden alıntı: garui

quote:

Orijinalden alıntı: Naples

Arkadaşlar C# Math trigonometri fonksiyonlarında yardım gerekiyor.

Öncelikle tan 1/kök3=60 derece bunu biliyoruz. Ben bu bölme işlemini yaptırdığımda 1.7320508075688774 bu sonucu buluyorum ve program 1.7320508075688 buraya kadar yazdırıyor.

Math.Tan fonksiyonuyla tan60ı bulmaya çalışınca 1.7320508075688767 bu sonuç çıkıyor ve yine 1.7320508075688 buraya kadar yazdırıyor.
Programımda eğer bu derece bulmaya çalışınca bunlar eşit olmuyor haliyle...
Şimdi bu iki şey yanlış mı? Bize mi yanlış öğretildi ben mi yanlış yapıyorum?

Teşekkürler

Hem doğru hem yanlış yapıyorsun. Kodu görmedim ama sorunun kayar nokta aritmetiği (floating point arithmetic) olduğunu söyleyebilirim. Bunların karşılaştırması == ile ancak değerler üzerinde işlem yapılmadıysa mümnkündür. Herhangi bir aritmetik işlem uygulandığı anda ortalık karışır :) (1.0/10.0 == 0.1)(false) diyebiliriz ama (0.1 == 0.1)(true) dur..

http://www.codeproject.com/Articles/16646/Reliable-Floating-Point-Equality-Comparison

http://csharp.2000things.com/tag/epsilon/

İşin içinde daha fazlası var diyebilirim. Hesaplamalardan gelecek değerlere göre mesela 2. linkteki EPILSON değeri işe yaramayabilir.






2.linkteki işime yarıyor. Ancak kullanıcı 60 derece girerse örneğin1,2345678 çıkıyorsa 61 girince 1,2346678 çıkıyor. Yani buradan ancak belirli şeyleri çıkarmaya yarar. Yardımınız için teşekkürler.
Ancak neden böyle sonuçlar çıkıyor? Yani bunların eşit olması gerekmez miydi?


Bu mesaja 1 cevap geldi.