Là khoa học notation an toàn cho integer hằng số c?


0 Phiếu
Đã hỏi 24/5/2016 bởi ThankPosting (230 điểm)
Trong một thời gian, tôi đã đại diện cho các quyền hạn lớn của 10 hằng số bằng cách sử dụng ký hiệu khoa học, chỉ vì vậy tôi không có để đếm các số không. Ví dụ:
#define DELAY_USEC 1e6
một đồng nghiệp chỉ ra rằng điều này không phải là an toàn, bởi vì nó không phải là một integer và không đảm bảo để luôn luôn bằng 1000000 chính xác . Tài liệu hướng dẫn có vẻ như để khẳng định điều này, nhưng tôi tự hỏi, nếu nó true trong thực tiễn. Có cách nào một cách an toàn có thể tuyên bố một năng lượng mười integer bằng cách sử dụng một cách viết tắt? Là nó an toàn để cast một int trong các xác định?

5 Câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi Vf426Help (580 điểm)
 
Câu trả lời hay nhất
Bạn hỏi cụ thể về quyền hạn của mười. 1e6 sẽ là chính xác một triệu. Bạn có thể đi đến 1e22 mà không có bất cứ điều gì xấu xảy ra. Tuy nhiên, lưu ý rằng trong C ++ và C, 1e6 là một hằng số double, chứ không phải là một hằng số integer . Năng lượng tiêu cực của mười là một câu chuyện khác nhau. 1e-1 là những, như tất cả các quyền hạn thấp.
Đã bình luận 04/6/2016 bởi Know_9361 (920 điểm)
Bạn không đúc nó để một int trong các xác định. Nếu bạn muốn một hằng số không thể thiếu cho sự an toàn của type , và làm cho nó ngắn cho ngắn gọn, bạn có thể sử dụng một chữ thập lục phân.
Đã bình luận 04/6/2016 bởi Guv_385 (100 điểm)
Tôi đoán vì kể từ khi bạn xác định một phao, không có cách nào để biết nếu đó là những gì nó sẽ được chính xác kể từ khi nổi điểm số có giới hạn độ chính xác.
0 Phiếu
Đã trả lời 25/5/2016 bởi Syn_me (370 điểm)
Bạn muốn sử dụng người dùng xác định literals:
constexpr long long operator "" _k(long long l) {
    return l * 1000;
}
constexpr long long operator "" _m(long long l) {
    return l * 1000 * 1000;
}
sau đó bạn có thể làm đơn giản:
long long delay = 1_m;
long long wait = 45_k;
Đã bình luận 26/5/2016 bởi Hcmolla (1,200 điểm)
bạn có thể lưu ý trong integer điện-của-ten và cho rằng đó là một (bởi nameing các quy ước cho ví dụ) và chỉ có thể vượt qua nó để true sức mạnh-của-10 trong thực thi luật, đó là an toàn.
–1 Phiếu
Đã trả lời 03/6/2016 bởi disallows (440 điểm)
Bạn muốn sử dụng người dùng xác định literals:
constexpr long long operator "" _k(long long l) {
    return l * 1000;
}
constexpr long long operator "" _m(long long l) {
    return l * 1000 * 1000;
}
sau đó bạn có thể làm đơn giản:
long long delay = 1_m;
long long wait = 45_k;
0 Phiếu
Đã trả lời 04/6/2016 bởi lein_Goley (1,170 điểm)
Bạn sẽ không bao giờ có làm tròn lỗi trên một cái gì đó ít hơn INT_MAX, kể từ khi đặc điểm kỹ thuật cho double đặt sang một bên 52 bit cho bạn sử dụng . Thành phần phân đoạn của bạn"" là chỉ nguyên của bạn, và số mũ của bạn"" sẽ là 1 floating point không phải đấu tranh với điều đó.
Đã bình luận 05/6/2016 bởi crash_Esp (1,040 điểm)
Một vấn đề với điều này là trong mỗi expression nó là một phần của sẽ được đánh giá trong 'đôi' chính xác, mà là có lẽ không gì bạn muốn.
0 Phiếu
Đã trả lời 04/6/2016 bởi vzcrevay (140 điểm)
Theo lý thuyết, không có. Ngôn ngữ không chỉ định làm thế nào nổi điểm giá trị được đại diện, hoặc giá trị mà có thể được biểu diễn chính xác. (UPDATE: rõ ràng, C11 đề nghị một đại diện. C ++, và lớn C phương ngữ, không). Trong thực tế, có, cho một phạm vi rộng lớn của các giá trị. Bất kỳ thực hiện bạn đang điều khiển từ xa có khả năng gặp phải sẽ sử dụng một IEEE 64-bit đại diện cho double. Điều này có thể đại diện cho bất kỳ value integer lên đến 2 53 (xấp xỉ 9 x 10 15 ) chính xác. Nó chắc chắn có thể đại diện cho bất cứ điều gì USD theo kiểu 32-bit integer .
Đã bình luận 05/6/2016 bởi gunhow (370 điểm)
đây không phải là câu trả lời cho câu hỏi của bạn, nhưng hãy nhớ rằng bạn có thể sử dụng toán học khi xác định hằng số như ' tĩnh const int SEC _TO_ MILLI = 1000; static const int SEC _TO_ MICRO = 1000 * SEC _TO_ MILLI;' điều này thường xuyên giúp tôi tránh cần literals dễ bị lỗi số phức tạp.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...