Apakah ada perbedaan antara ini:
float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);
Seperti yang saya pahami, kedua kasus memiliki hasil yang sama. Apakah ada perbedaan dalam kode yang dikompilasi?
c++
c
floating-point
OgreSwamp
sumber
sumber
floor
, tetapi berhati-hatilah karena inidouble
bukan untukfloat
. C99 juga memilikifloorf
untukfloat
.#include<cmath>
dan gunakanstd::floor
)bar
?Jawaban:
Mentransmisikan ke int akan dipotong ke arah nol.
floor()
akan memotong ke arah negatif tak hingga. Ini akan memberi Anda nilai yang berbeda jikabar
negatif.sumber
floor()
maksudnya, adalah jika nilaibar
terlalu besar untuk muatint
.Seperti yang telah dikatakan sebelumnya, untuk bilangan positif mereka sama, tetapi berbeda untuk bilangan negatif. Aturannya adalah int membulatkan menuju 0, sedangkan floor membulatkan menuju negatif tak terhingga.
Dengan demikian, ada juga perbedaan waktu eksekusi. Di sistem saya, saya menghitung waktu casting setidaknya 3 kali lebih cepat dari floor.
Saya memiliki kode yang memerlukan pengoperasian lantai dengan kisaran nilai yang terbatas, termasuk angka negatif. Dan itu harus sangat efisien, jadi kami menggunakan fungsi berikut untuk itu:
Tentu saja ini akan gagal untuk nilai x yang sangat besar (Anda akan mengalami beberapa masalah luapan) dan untuk nilai negatif di bawah -100000, dll. Tapi saya telah mencatatnya setidaknya 3 kali lebih cepat dari lantai, yang sangat penting untuk aplikasi kita. Ambillah dengan sebutir garam, uji pada sistem Anda, dll. Tetapi ada baiknya mempertimbangkan IMHO.
sumber
float
, bukandouble
- mungkindouble
aplikasi Anda. Jika di C, pastikan untuk menggunakanfloorf()
denganfloat
s.SO 101, jangan ubah pertanyaan Anda setelah orang menjawab pertanyaan Anda, melainkan tulis pertanyaan baru.
Menurut Anda, mengapa mereka akan mendapatkan hasil yang sama?
sumber
fabs
? Pertanyaannya tentangfloor
. Lantai0.33333
... adalah0
.EDIT: Karena pertanyaan mungkin telah diubah karena kebingungan antara
fabs()
danfloor()
.Diberikan baris contoh pertanyaan asli:
Perbedaannya adalah jika batang negatif, hasilnya akan negatif dengan yang pertama tetapi positif dengan yang kedua. Yang pertama akan dipotong menjadi integer dan yang kedua akan mengembalikan nilai desimal penuh termasuk bagian pecahan.
sumber
Iya.
fabs
mengembalikan nilai absolut dari argumennya, dan cast ke int menyebabkan pemotongan divisi (turun ke int terdekat), sehingga hasilnya hampir selalu berbeda.sumber
Ada dua perbedaan utama:
Seperti yang telah ditunjukkan orang lain, casting ke integer akan dipotong ke nol, sedangkan
floor()
akan selalu dipotong ke arah negatif tak terhingga; ini adalah perilaku yang berbeda untuk operan negatif.Tidak ada seorang pun (belum) yang menunjukkan perbedaan lain - jika argumen Anda lebih besar dari atau sama dengan
MAX_INT+1
(atau kurang dari-MAX_INT-1
) maka mentransmisikan keint
bit paling atas akan dijatuhkan (C, mungkin) atau perilaku tidak terdefinisi ( C ++ dan mungkin C). Misalnya jika Andaint
32 bit, Anda hanya akan memiliki bit tanda ditambah 31 bit data. Jadi menggunakan ini dengandouble
yang berukuran besar akan menghasilkan hasil yang tidak diinginkan.sumber
int
meluap adalah argumennya lebih besar atau sama denganINT_MAX
+1. Secara simetris, kondisi underflow adalah argumennya lebih rendah atau sama denganINT_MIN
-1.(int) x
adalah permintaan untuk mempertahankan bagian integerx
(tidak ada pembulatan di sini)fabs(x)
= | x | jadi itu>= 0
;Mis:
(int) -3.5
kembali-3
;fabs(-3.5)
kembali3.5
;Secara umum,
fabs (x) >= x
untuk semua x;x >= (int) x
jikax >= 0
x < (int) x
jikax < 0
sumber