Số Dấu Phẩy Động Trong C++

--- Bài mới hơn ---

  • Tìm Số Đảo Ngược Của Một Số Trong C++
  • Cộng Trừ Nhân Chia 2 Số Nguyên Lớn
  • Kỹ Thuật Debug Trên Visual Studio
  • Hướng Dẫn Lập Trình C++ Và Gỡ Lỗi Với Visual Studio Code
  • Kiểu Enum Trong Lập Trình C#
  • Ở các bài trước, chúng ta đã làm quen với khái niệm kiểu dữ liệu, và đã học một trong số những kiểu cơ bản trong C++ là kiểu số nguyên – int. Bây giờ là thời điểm để nói về một kiểu dữ liệu khác, nó được thiết kế để biểu diễn và lưu trữ các số có phần thập phân.

    Đây là những số có (hoặc có thể có) một phần thập phân sau dấu thập phân, và mặc dù đây là một định nghĩa rất đơn giản nhưng nó cũng đủ cho mục đích của chúng ta. Bất cứ khi nào chúng ta sử dụng thuật ngữ “hai và một phần hai” hoặc “không phẩy bốn” thì đó là khi chúng ta nghĩ về một số mà máy tính coi nó là số floating.

    Hãy quay trở lại với những giá trị mà chúng tôi trích dẫn ở trên. Rất bình thường khi chúng ta sử dụng “hai và một phần hai” trong một chương trình, mặc dù ngôn ngữ tự nhiên của bạn sử dụng dấu phẩy thay vì dấu chấm trong khi biển diễn số thì bạn cũng nên chắc chắn rằng số của bạn chứa dấu chấm chứ không phải dấu phẩy. Compiler sẽ không chấp nhận hoặc không hiểu ý định của bạn, bởi vì dấy phẩy có ý nghĩa riêng của nó trong ngôn ngữ C++.

    Nếu bạn muốn sử dung một giá trị “hai và một phần hai”, bạn nên viết như sau →

    Chú ý một lần nữa – giữa số “2” và số “5” là đấy chấm chứ không phải dấu phẩy.

    Bạn có thể viết giá trị của “không phẩy bốn” trong C++ như sau →

    Đừng quên nguyên tắc đơn giản này – bạn có thể bỏ qua số 0 nếu nó là số duy nhất ở phía trước hoặc phía sau dấu thập phân. Về bản chất, bạn có thể viết giá trị “không phẩy bốn” như sau

    Bạn cũng có thể viết giá trị của 4.0 bằng cách viết 4. mà không làm thay đổi kiểu của nó.

    Chú ý: Dấu thập phân là cần thiết để phân biệt số dấu phẩy động trong C++. Hãy nhìn vào 2 số sau:

    Có thể bạn nghĩ rằng nó giống nhau, nhưng C++ compiler thì không nghĩ vậy:

    Chúng ta có thể nói rằng dấu chấm tạo ra số float. Đừng quên điều đó.

    Khi bạn muốn sử dụng bất cứ số nào quá lớn hoặc quá nhỏ, bạn có thể sử dụng scientific notation. Ví dụ tốc độ ánh sáng tính theo m/s nếu viết trực tiếp thì sẽ như sau:

    Để tránh việc phải viết quá nhiều số 0 thì sách giáo khoa vật lý sử dụng cách viết tắt mà có thể bạn đã biết:

    Nó có nghĩa là: 3 nhân với mười mũ tám

    Trong C++, tác dụng tương tự được thực hiện trong một hình thức hơi khác:

    Chữ cái E (bạn cũng có thể sử dụng e – nó là viết tắt của exponent) có nghĩa là mười mũ.

    Chú ý:

    • số mũ (giá trị đằng sau “E”) phải là một số nguyên.
    • số base (giá trị đằng trước “E”) có thể là một số nguyên hoặc không.

    --- Bài cũ hơn ---

  • Những Điều Bạn Cần Biết Khi Học Lập Trình Với Dev C++
  • Dev C++ Là Gì? Hướng Dẫn Tải Và Cài Đặt Trình Biên Dịch Dev C++
  • Cấu Hình Định Tuyến Mặc Định (Default Route) P2
  • Default Gateway Là Gì? Khi Nào Cần Dùng Đến Default Gateway?
  • Vai Trò Của Từ Khóa Default Và Break Trong Switch Case?
  • C++ — ‘const Static’ Có Nghĩa Là Gì Trong C Và C ++?

    --- Bài mới hơn ---

  • 1.5.7 Sử Dụng Giá Trị Kiểu Char Như Giá Trị Kiểu Int
  • Giới Thiệu Về Kiểu Dữ Liệu Char Trong C++
  • Bài 1: C++ Là Gì? Ứng Dụng C++? Vì Sao Nên Học C++?
  • Ngôn Ngữ Lập Trình C++ Là Gì? Tương Lai Ngôn Ngữ C++ Sẽ Ra Sao?
  • 1.3 Sử Dụng Các Lệnh Liên Quan Đến Xuất Dữ Liệu
  • Dòng mã đó thực sự có thể xuất hiện trong một số bối cảnh khác nhau và mặc dù nó hoạt động gần giống nhau, có những khác biệt nhỏ.

    Phạm vi không gian tên

    // foo.h static const int i = 0;

    i‘ sẽ hiển thị trong mọi đơn vị dịch thuật bao gồm tiêu đề. Tuy nhiên, trừ khi bạn thực sự sử dụng địa chỉ của đối tượng (ví dụ: ‘&i‘), tôi khá chắc chắn rằng trình biên dịch sẽ coi ‘i‘ đơn giản là một loại an toàn 0. Khi có thêm hai đơn vị dịch thuật lấy ‘&i‘ thì địa chỉ sẽ khác nhau cho mỗi đơn vị dịch thuật.

    // foo.cc static const int i = 0;

    i‘ có liên kết bên trong và do đó không thể được tham chiếu từ bên ngoài đơn vị dịch thuật này. Tuy nhiên, một lần nữa trừ khi bạn sử dụng địa chỉ của nó, rất có thể nó sẽ được coi là loại an toàn 0.

    Một điều đáng để chỉ ra, đó là tuyên bố sau:

    const int i1 = 0;

    chính xác giống như static const int i = 0. Một biến trong một không gian tên được khai báo bằng const và không được khai báo rõ ràng bằng extern là hoàn toàn tĩnh. Nếu bạn nghĩ về điều này, ý định của ủy ban C++ là cho phép các biến const được khai báo trong các tệp tiêu đề mà không cần luôn luôn cần từ khóa static để tránh phá vỡ ODR.

    Phạm vi lớp học

    class A { public: static const int i = 0; };

    Trong ví dụ trên, tiêu chuẩn chỉ định rõ ràng rằng ‘i‘ không cần phải được xác định nếu không yêu cầu địa chỉ của nó. Nói cách khác, nếu bạn chỉ sử dụng ‘i‘ là loại an toàn 0 thì trình biên dịch sẽ không định nghĩa nó. Một điểm khác biệt giữa các phiên bản lớp và không gian tên là địa chỉ của ‘i‘ (nếu được sử dụng trong hai đơn vị dịch thuật nhiều quặng hơn) sẽ giống nhau cho thành viên lớp. Địa chỉ được sử dụng, bạn phải có định nghĩa cho địa chỉ đó:

    // a.h class A { public: static const int i = 0; }; // a.cc #include "a.h" const int A::i; // Definition so that we can take the address

    --- Bài cũ hơn ---

  • C++ — Có Bao Nhiêu Và Việc Sử Dụng “const” Trong C ++ Là Bao Nhiêu?
  • Hằng Số Trong C++ (Constants)
  • 4.7. Hành Trình Không Dừng Lại
  • Lập Trình Chuẩn C++11 Như Một Ngôn Ngữ Mới
  • Biến Trong C (Bài 2)
  • Số Dấu Phẩy Động(Float, Double,…) Trong C++

    --- Bài mới hơn ---

  • Chi Tiết Bài Học C++ Cout, Cin, Endl
  • Giới Thiệu Về Iostream: Cout, Cin Và Endl
  • Lập Trình C: Hàm (Function)
  • Cơ Bản Về Hàm Và Giá Trị Trả Về (Basic Of Functions And Return Values)
  • Câu Lệnh While Trong C++
  • Số nguyên rất tốt để sử dụng, nhưng đôi khi chúng ta cần lưu trữ số rất lớn hoặc số có thành phần phân số. Biến kiểu dấu phẩy động là biến có thể chứa một số thực, chẳng hạn như 4320.0, -3.33 hoặc 0.01226. Có nghĩa là biến đó có thể chứa một số có phần thập phân.

    Có ba kiểu dữ liệu dấu phẩy động khác nhau: float, double và long double. Cũng như các số nguyên, C ++ không xác định kích thước thực tế của các loại này (nhưng nó đảm bảo kích thước tối thiểu). Trên các kiến ​​trúc máy hiện đại, biểu diễn dấu phẩy động hầu như luôn tuân theo định dạng nhị phân IEEE 754. Trong định dạng này, float là 4 byte, double là 8 và double double có thể tương đương với double (8 byte), 80 bit (thường được đệm thành 12 byte) hoặc 16 byte.

    Các kiểu dữ liệu dấu phẩy động luôn có ký hiệu (có dấu) (có thể giữ các giá trị dương và âm).

    CategoryTypeMinimum SizeTypical Sizefloating pointfloat4 bytes4 bytesdouble8 bytes8 byteslong double8 bytes8, 12, or 16 bytes

    float fValue; double dValue; long double ldValue;

    Khi sử dụng float literals(literals là gì?), luôn luôn bao gồm ít nhất một chữ số thập phân (ngay cả khi số thập phân bằng 0). Điều này giúp trình biên dịch hiểu rằng số này là số kiểu dấu phẩy động chứ không phải là số nguyên.

    int x{5}; // 5 means integer double y{5.0}; // 5.0 is a floating point literal (no suffix means double type by default) float z{5.0f}; // 5.0 is a floating point literal, f suffix means float type

    Lưu ý rằng theo mặc định, dấu phẩy động mặc định sẽ là kiểu double. Một hậu tố f được sử dụng để biểu thị cho kiểu float.

    1. In số dấu phẩy động(floating point)

    Bây giờ hãy xem xét chương trình đơn giản này:

    int main()

    {

    std::cout << 5.0 << ‘n’;

    std::cout << 6.7f << ‘n’;

    std::cout << 9876543.21 << ‘n’;

    }

    Kết quả của chương trình tưởng chừng đơn giản này có thể làm bạn ngạc nhiên:

    5 6.7 9.87654e+06

    Trong trường hợp đầu tiên, std :: cout đã in 5, mặc dù chúng ta đã gõ là 5.0. Theo mặc định, std :: cout sẽ không in phần phân số của số nếu phần phân số bằng 0.

    Trong trường hợp thứ hai, count in ra như chúng ta mong đợi.

    Trong trường hợp thứ ba, nó đã in số theo ký hiệu khoa học (vì số này quá lớn).

    2. Phạm vi, kích thước của số floating(Số dấu phẩy động)

    Giả sử ta có IEEE 754:

    SizePhạm viĐộ chính xác4 bytes±1.18 x 10-38 to ±3.4 x 1038Từ 6-9 chữ số, thông thường là 78 bytes±2.23 x 10-308 to ±1.80 x 10308Từ 15-18 chữ số, thông thường thì 1680-bits (thông thường sử dụng 12 or 16 bytes)±3.36 x 10-4932 to ±1.18 x 104932Từ 18-21 chữ số16 bytes±3.36 x 10-4932 to ±1.18 x 104932Từ 33-36 chữ số

    Loại dấu phẩy động 80 bit có một chút bất thường. Trên các bộ xử lý hiện đại, nó thường được triển khai bằng cách sử dụng 12 hoặc 16 byte (đây là kích thước tự nhiên để xử lý).

    Có vẻ hơi lạ khi 80 bit có cùng phạm vi với số dấu phẩy động 16 byte. Điều này là do chúng có cùng số bit dành riêng cho số mũ – tuy nhiên, số 16 byte có thể lưu trữ các chữ số nhiều hơn

    3. Độ chính xác của dấu phẩy động

    Xét phân số 1/3. Số thập phân của số này là 0,3333333333333 với 3 đi ra vô cùng. Nếu bạn đang viết số này trên một tờ giấy, đôi lúc cánh tay của bạn sẽ mệt mỏi và cuối cùng bạn sẽ dừng viết. Và số bạn còn lại sẽ ở gần 0,333333333. Nhưng không chính xác.

    Trên máy tính, số lượng chiều dài vô hạn sẽ cần bộ nhớ vô hạn để lưu trữ và thông thường chúng ta chỉ có 4 hoặc 8 byte. Bộ nhớ hạn chế này có nghĩa là số dấu phẩy động chỉ có thể lưu trữ một số chữ số có nghĩa nhất định – và bất kỳ chữ số có nghĩa bổ sung nào cũng bị mất. Số thực sự được lưu trữ sẽ gần với số mong muốn, nhưng không chính xác.

    Độ chính xác của một số dấu phẩy động xác định có bao nhiêu chữ số có thể biểu thị mà không mất thông tin.

    Khi xuất các số dấu phẩy động, std :: cout có độ chính xác mặc định là 6 – nghĩa là, nó giả sử tất cả các biến dấu phẩy động chỉ in ra được 6 chữ số (độ chính xác tối thiểu của một dấu phẩy) và do đó nó sẽ cắt bất cứ thứ gì sau đó .

    Chương trình sau đây hiển thị std :: cout cắt ngắn thành 6 chữ số:

    int main()

    {

    std::cout << 9.87654321f << ‘n’;

    std::cout << 987.654321f << ‘n’;

    std::cout << 987654.321f << ‘n’;

    std::cout << 9876543.21f << ‘n’;

    std::cout << 0.0000987654321f << ‘n’;

    return 0;

    }

    Chương trình này xuất ra:

    9.87654 987.654 987654 9.87654e+006 9.87654e-005

    Lưu ý rằng mỗi trong số này chỉ có 6 chữ số có nghĩa hay chỉ có 6 chữ số được in ra.

    Cũng lưu ý rằng std :: cout sẽ chuyển sang xuất số theo ký hiệu khoa học trong một số trường hợp(số đó quá lớn). Tùy thuộc vào trình biên dịch, số mũ thường sẽ được đệm đến một số chữ số tối thiểu. Đừng sợ, 9,87654e + 006 giống như 9,87654e6. Số chữ số mũ tối thiểu được hiển thị là dành riêng cho trình biên dịch (Visual Studio sử dụng 3, một số khác sử dụng 2 theo tiêu chuẩn C99).

    Số chữ số của độ chính xác của biến số dấu phẩy động phụ thuộc vào cả kích thước (số float có độ chính xác thấp hơn gấp đôi) và giá trị cụ thể được lưu trữ (một số giá trị có độ chính xác cao hơn các giá trị khác). Giá trị float có độ chính xác từ 6 đến 9 chữ số, với hầu hết các giá trị float có ít nhất 7 chữ số có nghĩa. Giá trị double có độ chính xác từ 15 đến 18 chữ số, với hầu hết các giá trị double có ít nhất 16 chữ số có nghĩa. Long double có độ chính xác tối thiểu là 15, 18 hoặc 33 chữ số có nghĩa tùy thuộc vào số lượng byte chiếm.

    Chúng ta có thể ghi đè độ chính xác mặc định mà std :: cout hiển thị bằng cách sử dụng hàm std :: setpcision () được xác định trong tiêu đề iomanip.

    int main()

    {

    std::cout << std::setpcision(16); // show 16 digits of pcision

    std::cout << 3.33333333333333333333333333333333333333f <<‘n’; // f suffix means float

    std::cout << 3.33333333333333333333333333333333333333 << ‘n’; // no suffix means double

    return 0;

    }

    Outputs:

    3.333333253860474 3.333333333333334

    Vì chúng ta đặt độ chính xác thành 16 chữ số, mỗi số ở trên được in 16 chữ số. Nhưng, như bạn có thể thấy, những con số chắc chắn có thể chính xác đến 16 chữ số!

    Các vấn đề chính xác không chỉ có tác động đến các số phân số, chúng còn tác động đến bất kỳ số nào có quá nhiều chữ số có nghĩa. Hãy xem xét một số lượng lớn:

    int main()

    {

    float f { 123456789.0f }; // f has 10 significant digits

    std::cout << std::setpcision(9); // to show 9 digits in f

    std::cout << f << ‘n’;

    return 0;

    }

    Output:

    123456792

    123456792 lớn hơn 123456789. Giá trị 123456789.0 có 10 chữ số có nghĩa, nhưng giá trị float thường có 7 chữ số chính xác (và kết quả của 123456792 chỉ chính xác đến 7 chữ số có nghĩa). Chúng ta đã mất độ chính xác của một số! Khi độ chính xác bị mất vì một số chỉ có thể được lưu trữ được như vậy thôi thì đây được gọi là lỗi làm tròn.

    Do đó, người ta phải cẩn thận khi sử dụng các số dấu phẩy động đòi hỏi độ chính xác cao.

    Thực hành tốt nhất ở đây là

    Ưu tiên sử dụng double so với float khi cần không gian ở mức cao, vì sự thiếu chính xác trong float thường sẽ dẫn đến kết quả không chính xác.

    4. Lỗi làm tròn trong các phép so sánh dấu phẩy động

    Số dấu phẩy động rất khó để làm việc do sự khác biệt không rõ ràng giữa số nhị phân (cách lưu trữ dữ liệu) và số thập phân (cách chúng ta thấy). Xét phân số 1/10. Trong phần thập phân, số này dễ dàng được biểu thị bằng 0,1 và chúng ta thường nghĩ 0,1 là một số dễ biểu thị với 1 chữ số có nghĩa. Tuy nhiên, trong hệ nhị phân, 0,1 được biểu thị bằng chuỗi vô hạn: 0,00011001100110011 Bằng cách này, khi chúng ta gán 0,1 cho một số dấu phẩy động, chúng ta sẽ gặp vấn đề về độ chính xác.

    Bạn có thể thấy tác dụng của việc này trong chương trình sau:

    int main()

    {

    double d{0.1};

    std::cout << d << ‘n’; // use default cout pcision of 6

    std::cout << std::setpcision(17);

    std::cout << d << ‘n’;

    return 0;

    }

    Kết quả:

    0.1 0.10000000000000001

    Trên dòng trên cùng, std :: cout in 0.1, như chúng ta mong đợi.

    Ở dòng dưới cùng, nơi chúng ta có std :: cout cho chúng ta thấy 17 chữ số chính xác, chúng ta thấy rằng d thực sự không hoàn toàn 0,1! Điều này là do double phải cắt ngắn xấp xỉ do bộ nhớ hạn chế của nó. Kết quả là một số chính xác đến 16 chữ số, nhưng số này không chính xác 0,1. Lỗi làm tròn có thể làm cho một số nhỏ hơn hoặc lớn hơn một chút, tùy thuộc vào nơi xảy ra cắt ngắn.

    Lỗi làm tròn có thể có hậu quả không mong muốn:

    int main()

    {

    std::cout << std::setpcision(17);

    double d1(1.0);

    std::cout << d1 << std::endl;

    double d2(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1); // should equal 1.0

    std::cout << d2 << std::endl;

    }

    1 0.99999999999999989

    Một lưu ý cuối cùng về lỗi làm tròn: các phép toán (như cộng và nhân) có xu hướng làm cho lỗi làm tròn tăng lên. Vì vậy, mặc dù 0,1 có lỗi làm tròn ở chữ số có nghĩa thứ 17, nhưng khi chúng ta thêm 0,1 mười lần, lỗi làm tròn đã len lỏi vào chữ số có nghĩa thứ 16. Các hoạt động liên tục sẽ khiến lỗi này ngày càng trở nên nghiêm trọng hơn.

    Một hệ quả của quy tắc này là: không bao giờ sử dụng số dấu phẩy động cho dữ liệu tài chính hoặc tiền tệ.

    5. NaN and Inf

    Có hai loại số dấu phẩy động đặc biệt. Đầu tiên là Inf, đại diện cho vô cùng. Inf có thể tích cực hoặc tiêu cực. Thứ hai là NaN, viết tắt của cụm từ “Not a Number”. Có một số loại NaN khác nhau.

    Ở đây, một chương trình hiển thị cả ba:

    int main()

    {

    double zero {0.0};

    double posinf { 5.0 / zero }; // positive infinity

    std::cout << posinf << std::endl;

    double neginf { -5.0 / zero }; // negative infinity

    std::cout << neginf << std::endl;

    double nan { zero / zero }; // not a number (mathematically invalid)

    std::cout << nan << std::endl;

    return 0;

    }

    Và kết quả khi sử dụng Visual Studio 2008 trên Windows:

    1.#INF -1.#INF 1.#IND

    INF là viết tắt của infinity(vô cùng), và IND là viết tắt của indeterminate(không xác định). Lưu ý rằng kết quả in ra Inf và NaN tuỳ vào từng nền tảng cụ thể, vì vậy kết quả của bạn có thể thay đổi.

    Tóm lại, hai điều bạn nên nhớ về số dấu phẩy động:

    1) Số dấu phẩy động rất hữu ích để lưu trữ các số rất lớn hoặc rất nhỏ, bao gồm cả các số có thành phần phân số.

    2) Số dấu phẩy động thường có sai số làm tròn nhưng khá nhỏ, ngay cả khi số có ít chữ số có nghĩa(ít chữ số được hiển thị). Thường thì chúng ta không chú ý tới nó vì chúng quá nhỏ và vì các số bị cắt bớt khi được in ra. Tuy nhiên, so sánh các số dấu phẩy động có thể không cho ra kết quả như mong đợi. Thực hiện các phép toán trên các giá trị này sẽ khiến các lỗi làm tròn ngày càng lớn hơn.

    Bạn thấy chất lượng bài viết này tốt không?

    --- Bài cũ hơn ---

  • Prototype Là Khỉ Gì ?
  • Hàm Templates Trong C++
  • Lỗi Thường Gặp Khi Mới Học Template Trong C++
  • Hướng Dẫn Cách Nạp Dữ Liệu Từ File Xml Vào Excel Chi Tiết Nhất
  • Google Workspace, Microsoft 365 Và Zoho Workplace
  • Em Yêu Dấu _ Nhưng ‘dấu’ Nghĩa Là Gì

    --- Bài mới hơn ---

  • Review Sách Ngựa Ô Yêu Dấu
  • Anh Yêu Em Tiếng Nhật (Aishiteru) Cách Nói Đốn Gục Trái Tim Của Nàng
  • Tổng Hợp Cách Nói Anh Yêu Em Tiếng Nhật
  • Bỏ Túi Từ Vựng Tiếng Anh Về Tình Yêu Để “thả Thính” Crush
  • Hé Lộ Nguồn Gốc Câu Thoại ‘i Love You 3000’ Trong ‘avengers: Endgame’
  • Từ thời xa xưa, ngôn ngữ Việt Nam đã rất đa dạng, phong phú. Nhất là những từ ngữ cổ bởi chúng có thể diễn tả sâu sắc nội tâm của con người, diễn tả chi tiết về sự vật, hiện tượng…. Cho đến ngày nay, chúng vẫn tồn tại nhưng lại thường bị mất nghĩa hoặc bị hiểu sai.

    Chúng ta vẫn thường nói, em yêu dấu, ‘yêu’ thì hiểu rồi, nhưng ‘dấu’ nghĩa là gì?

    ‘Dấu’ là một từ cổ, sách Đại Nam quốc âm tự vị của Huỳnh Tịnh Của giảng: ‘dấu’ nghĩa là ‘yêu mến’. Từ điển Việt-Bồ-La của Alexandre de Rhodes (1651) cũng giải thích ‘dấu’ là một từ cổ để chỉ sự thương yêu. Ông cho ví dụ: Thuốc dấu là ‘bùa để làm cho yêu’.

    Tục ngữ Việt Nam nói ‘Con vua vua dấu, con chúa chúa yêu’, còn Hồ Xuân Hương trong bài thơ Cái quạt giấy (bài hai) thì viết ‘Chúa dấu vua yêu một cái này’. Có thể thấy, ‘dấu’ và ‘yêu’ là hai từ có ý nghĩa tương đương, ngày xưa dùng hai từ độc lập, nhưng bây giờ ta có thể thấy từ ‘yêu’ vẫn còn được viết hay nói một mình, còn từ ‘dấu’ thì không ai dùng một mình nữa. Giờ đây, thay vì ‘anh yêu em’ mà nói ‘anh dấu em’ thì không khéo lại bị hỏi ‘anh giấu cái gì?’.

    Trong từ ‘chợ búa’ thì ‘búa’ có nghĩa là gì?

    ‘Búa’ là âm xưa của chữ . Sách ‘Đại Nam quốc âm tự vị’ của Huỳnh Tịnh Của giảng: ‘Gộc’ là ‘cây củi có khúc đẩn(?) mà lớn’ và cho ví dụ ‘ông gộc’ là người già cả hơn hết hoặc làm lớn hơn hết trong một xứ. Cũng có tài liệu giảng ‘gộc’ là ‘đoạn gốc của cây tre, cây vầu’ hay có nghĩa là ‘to lớn’.

    Theo đó, gậy gộc nghĩa là những cây gậy lớn, thường dùng để đánh nhau.

    Mình hay nói ‘hỏi han’ nhau, ‘hỏi’ thì rõ nghĩa rồi, vậy ‘han’ có nghĩa không?

    Tương tự như ‘gậy gộc’, ‘hỏi han’ không phải là từ láy mà là từ ghép đẳng lập, trong đó cả ‘hỏi’ và ‘han’ đều có nghĩa.

    ‘Han’ nghĩa là ‘hỏi tới’, ‘nói tới’.

    Đại Nam quốc âm tự vị của Huỳnh Tịnh Của giải thích: ‘han’ nghĩa là ‘hỏi tới’, ‘nói tới’. Theo đó, ‘hỏi han’ nghĩa là hỏi một việc gì đó, hỏi tới hay nói tới một việc nào đó.

    Truyện Kiều của Nguyễn Du từng dùng ‘han’ như một từ độc lập, không dính đến từ ‘hỏi’, trong câu: ‘Trước xe lơi lả han chào / Vâng lời nàng mới bước vào tận nơi’ (Phần Kiều rơi vào tay Tú Bà và Mã Giám Sinh). ‘Han chào’ chính là chào hỏi.

    Khi mình nói về một chuyện gì đó ‘to tát’ thì ‘tát’ có nghĩa là gì?

    ‘Tát’ đúng ra phải dùng là ‘tác’.’Tác’ nghĩa là lớn, ta thường gặp qua từ ‘tuổi tác’.

    ‘To tát’ không phải là từ láy mà là từ ghép, cả ‘to’ và ‘tát’ đều có nghĩa. Tuy nhiên, ‘tát’ ở đây là một minh chứng cho hiện tượng dùng sai nhiều thì thành đúng trong ngôn ngữ. ‘Tát’ đúng ra phải dùng là ‘tác’.

    ‘Tác’ nghĩa là lớn, ta thường gặp qua từ ‘tuổi tác’. Khi nói ‘tuổi tác’ thì đã mang nghĩa lớn tuổi, già rồi.. Tuy nhiên, ngày nay mình hay nói ‘tuổi tác đã lớn’, cách nói này xét về nguồn gốc thì không đúng, bị lặp từ.

    Do trong quá trình sử dụng đã có nhiều biến chuyển, nên ‘tuổi tác’ thường dùng để chỉ tuổi. Thậm chí tuổi còn nhỏ cũng dùng ‘tuổi tác’, ví dụ: ‘Tuổi tác còn nhỏ’, ‘tuổi tác mới có bây lớn’,…

    Riêng từ ‘to tác’ để chỉ cái gì đó lớn thì đã dùng thành ‘to tát’. Tuy nhiên, để viết đúng chính tả tiếng Việt hiện đại thì mình vẫn cứ dùng ‘to tát’.

    Có câu, ‘cần cù bù thông minh’, ‘cần cù’ là từ láy hay từ ghép? ‘Cù’ có nghĩa gì không?

    ‘Cần’ là siêng năng chăm chỉ, ‘cù’ là khó nhọc, vất vả.

    ‘Cần cù’ là từ ghép, cả ‘cần’ và ‘cù’ đều có nghĩa. Đây là từ gốc Hán, viết là 勤劬. ‘Cần’ là siêng năng chăm chỉ, ‘cù’ là khó nhọc, vất vả.

    Chữ ‘cù’ này còn xuất hiện trong từ ‘cù lao’ (劬劳) chỉ công ơn cha mẹ (thường nói chín chữ cù lao).

    Truyện Kiều có câu: ‘Duyên hội ngộ, đức cù lao/Bên tình bên hiếu bên nào nặng hơn’. Không nên nhầm lẫn từ ‘cù lao’ này với từ ‘cù lao’ chỉ cồn đất/cát nổi lên giữa sông do phù sa bồi lắng.

    ‘Núc’ là ‘đồ đắp bằng đất thường làm ra ba hòn, có thể bắc nồi nấu ăn’ và có thể hiểu núc chính là ông Táo.

    – Núc là ‘đồ đắp bằng đất thường làm ra ba hòn, có thể bắc nồi nấu ăn’, cho nên có thể hiểu núc chính là ông Táo. (theo Huỳnh Tịnh Của, Đại Nam quốc âm tự vị)

    ‘Thêu thùa’ là từ ghép tổ hợp (hay ghép đẳng lập), trong đó cả thêu và thùa đều có nghĩa

    Thùa là kết chỉ thêm, làm cho đẹp thêm.

    – Thêu là dùng chỉ màu đính lên bề mặt vải làm ra hoa văn;

    – Thùa là kết chỉ thêm, làm cho đẹp thêm.

    Về cơ bản thì thêu và thùa giống nhau, đều là hành động thêm hoa văn trang trí trên vải vóc cho đẹp. Nhưng thùa đôi khi còn có nghĩa là hành động mạng lại chỗ vải bị rách cho đẹp.

    ‘Vải vóc’ là một từ ghép với chữ ‘vóc’ cũng có nghĩa

    Vóc là một xấp hàng lụa vừa đủ một quần là sáu thước may.

    – Vải là chỉ bông hoặc đồ dệt bằng chỉ bông;

    – Vóc là một xấp hàng lụa vừa đủ một quần là sáu thước may.

    Ngày nay thì vải không nhất thiết là dệt bằng chỉ bông mà có thể dệt bằng nhiều chất liệu khác. Còn vóc thì ít khi thấy dùng một mình nữa, người ta thường lầm tưởng ‘vải vóc’ là từ láy.

    --- Bài cũ hơn ---

  • Tuổi 20 Yêu Dấu, Cho Ai Đang, Và Ai Đã Đi Qua…
  • Điên Thì Có Sao: Seo Ye Ji Tự Ví Như ‘chú Chó Mùa Xuân’, Thoát Khỏi Xiềng Xích Bằng Cách Tự Cắt Đi Mái Tóc ‘ma Ám’ Của Mình
  • Yêu Nghiệt Chương 650: Sẽ Là Phương Pháp Gì Đâu?
  • Soái Ca Là Gì? Các Từ Vựng Tiếng Trung Chủ Đề Soái Ca
  • Vì Sao Yêu Nghiệt Xuất Hiện Là Điềm Báo Quốc Gia Sắp Suy Vong?
  • Bitwise Operators Trong C/c++ Là Gì?

    --- Bài mới hơn ---

  • Nạp Chồng Hàm Trong C++ (Function Overloading)
  • Danh Sách Liên Kết Đơn Trong C++
  • 60 Hợp Âm Piano Cơ Bản Bạn Có Thể Học Ngay Bây Giờ
  • Con Trỏ (Pointer) Trong C++
  • Khai Báo Và Định Nghĩa Hàm
  • Bitwise Operator là gì?

    Trong C, 6 toán tử sau được xếp vào bitwise operators (toán tử vận hành ở cấp bit)

    • & (bitwise AND) lấy hai số làm toán hạng và thực hiện AND lên từng bit của hai số này. Kết quả của AND sẽ chỉ là 1 cả hai bit đều cùng là 1.
    • ^ (bitwise XOR) lấy hai số làm toán hạng và thực hiện XOR lên từng bit của hai số này. Kết quả của XOR là 1 nếu hai bit khác nhau.
    • << (left shift) Lấy hai số, chuyển bits của toán hạng đầu tiên sang trái, toán hạng thứ hai quyết định số chỗ trống cần dịch chuyển.
    • Bitwsie operator trong C

    • ~ (bitwise NOT) Lấy một số và nghịch đảo tất cả bit của số đó.

    1) Không sử dụng các toán tử left shift và right shift cho số âm. Nếu bất kỳ toán hạng nào là số âm, kết quả sẽ là hành vi không xác định. Ví dụ: kết quả của cả -1 << 1 và 1 << -1 là không xác định. Ngoài ra, nếu số được shift nhiều hơn kích thước của số nguyên đó, hành vi cũng là không xác định. Ví dụ: 1 << 33 không xác định nếu số nguyên được lưu trữ với 32 bit.

    2) Toán tử bitwise XOR là toán tử hữu ích nhất cho những buổi phỏng vấn technical. Nó được sử dụng để giải quyết rất nhiều vấn đề. Một ví dụ đơn giản: Được đưa ra một tập hợp các số trong đó tất cả các phần tử xảy ra số lần chẵn trừ một số, tìm số xảy ra lẻ lẻ Vấn đề này có thể được giải quyết một cách hiệu quả bằng cách thực hiện XOR tất cả các số.

    // Function to return the only odd occurring element

    int findOdd(int arr;

    return res;

    }

    int main(void) {

    int arr);

    printf ("The odd occurring element is %d ", findOdd(arr, n));

    return 0;

    }

    // Output: The odd occurring element is 90

    4) Toán tử left-shift và right-shift tương đương với phép nhân và chia cho 2 tương ứng.

    Như đã đề cập ở điểm 1, hai toán tử này chỉ làm việc với số dương.

    5) Toán tử & có thể được sử dụng để nhanh chóng kiểm tra xem một số là số lẻ hay chẵn

    Giá trị của biểu thức (x & 1) sẽ khác không chỉ khi x là số lẻ, nếu không giá trị sẽ bằng không.

    6) Toán tử ~ nên được sử dụng một cách cẩn thận

    Kết quả của toán tử ~ trên một số nhỏ có thể là một số lớn nếu kết quả được lưu trữ trong một biến unsigned. Và kết quả có thể là một số âm nếu kết quả được lưu trữ trong một biến signed (giả sử rằng các số âm được lưu trữ ở dạng bổ sung của 2, trong đó bit ngoài cùng bên trái là sign bit).

    // Note that the output of the following program is compiler dependent

    int main()

    {

    unsigned int x = 1;

    printf("Signed Result %d n", ~x);

    printf("Unsigned Result %ud n", ~x);

    return 0;

    }

    /* Output:

    Signed Result -2

    Unsigned Result 4294967294d */

    --- Bài cũ hơn ---

  • Nạp Chồng Toán Tử Và Nạp Chồng Hàm Trong C++
  • Bài 7: Overload Toán Tử Trong Lập Trình Hướng Đối Tượng C++
  • Phương Thức Thanh Toán L/c
  • Sử Dụng Vector Trong Lập Trình C++
  • Hiện Thực Và Sử Dụng Hàm Memcmp
  • Số Dấu Phẩy Động(Float, Double,…) Trong C++ ” Cafedev.vn

    --- Bài mới hơn ---

  • Các Kiểu Dữ Liệu Trong C/c++
  • Sự Khác Biệt Giữa Float Và Double Là Gì?
  • While Và Do…while Trong C++
  • Vòng Lặp Do While Trong C++
  • Phân Biệt Abstract Class Và Interface Trong C++
  • Số nguyên rất tốt để sử dụng, nhưng đôi khi chúng ta cần lưu trữ số rất lớn hoặc số có thành phần phân số. Biến kiểu dấu phẩy động là biến có thể chứa một số thực, chẳng hạn như 4320.0, -3.33 hoặc 0.01226. Có nghĩa là biến đó có thể chứa một số có phần thập phân.

    Có ba kiểu dữ liệu dấu phẩy động khác nhau: float, double và long double. Cũng như các số nguyên, C ++ không xác định kích thước thực tế của các loại này (nhưng nó đảm bảo kích thước tối thiểu). Trên các kiến ​​trúc máy hiện đại, biểu diễn dấu phẩy động hầu như luôn tuân theo định dạng nhị phân IEEE 754. Trong định dạng này, float là 4 byte, double là 8 và double double có thể tương đương với double (8 byte), 80 bit (thường được đệm thành 12 byte) hoặc 16 byte.

    Các kiểu dữ liệu dấu phẩy động luôn có ký hiệu (có dấu) (có thể giữ các giá trị dương và âm).

    float fValue; double dValue; long double ldValue;

    Khi sử dụng float literals( literals là gì?), luôn luôn bao gồm ít nhất một chữ số thập phân (ngay cả khi số thập phân bằng 0). Điều này giúp trình biên dịch hiểu rằng số này là số kiểu dấu phẩy động chứ không phải là số nguyên.

    int x{5}; // 5 means integer double y{5.0}; // 5.0 is a floating point literal (no suffix means double type by default) float z{5.0f}; // 5.0 is a floating point literal, f suffix means float type

    Lưu ý rằng theo mặc định, dấu phẩy động mặc định sẽ là kiểu double. Một hậu tố f được sử dụng để biểu thị cho kiểu float.

    1. In số dấu phẩy động(floating point)

    Bây giờ hãy xem xét chương trình đơn giản này:

    Kết quả của chương trình tưởng chừng đơn giản này có thể làm bạn ngạc nhiên:

    5 6.7 9.87654e+06

    Trong trường hợp đầu tiên, std :: cout đã in 5, mặc dù chúng ta đã gõ là 5.0. Theo mặc định, std :: cout sẽ không in phần phân số của số nếu phần phân số bằng 0.

    Trong trường hợp thứ hai, count in ra như chúng ta mong đợi.

    Trong trường hợp thứ ba, nó đã in số theo ký hiệu khoa học (vì số này quá lớn).

    2. Phạm vi, kích thước của số floating(Số dấu phẩy động)

    Giả sử ta có IEEE 754:

    Loại dấu phẩy động 80 bit có một chút bất thường. Trên các bộ xử lý hiện đại, nó thường được triển khai bằng cách sử dụng 12 hoặc 16 byte (đây là kích thước tự nhiên để xử lý).

    Có vẻ hơi lạ khi 80 bit có cùng phạm vi với số dấu phẩy động 16 byte. Điều này là do chúng có cùng số bit dành riêng cho số mũ – tuy nhiên, số 16 byte có thể lưu trữ các chữ số nhiều hơn

    3. Độ chính xác của dấu phẩy động

    Xét phân số 1/3. Số thập phân của số này là 0,3333333333333 với 3 đi ra vô cùng. Nếu bạn đang viết số này trên một tờ giấy, đôi lúc cánh tay của bạn sẽ mệt mỏi và cuối cùng bạn sẽ dừng viết. Và số bạn còn lại sẽ ở gần 0,333333333. Nhưng không chính xác.

    Trên máy tính, số lượng chiều dài vô hạn sẽ cần bộ nhớ vô hạn để lưu trữ và thông thường chúng ta chỉ có 4 hoặc 8 byte. Bộ nhớ hạn chế này có nghĩa là số dấu phẩy động chỉ có thể lưu trữ một số chữ số có nghĩa nhất định – và bất kỳ chữ số có nghĩa bổ sung nào cũng bị mất. Số thực sự được lưu trữ sẽ gần với số mong muốn, nhưng không chính xác.

    Độ chính xác của một số dấu phẩy động xác định có bao nhiêu chữ số có thể biểu thị mà không mất thông tin.

    Khi xuất các số dấu phẩy động, std :: cout có độ chính xác mặc định là 6 – nghĩa là, nó giả sử tất cả các biến dấu phẩy động chỉ in ra được 6 chữ số (độ chính xác tối thiểu của một dấu phẩy) và do đó nó sẽ cắt bất cứ thứ gì sau đó .

    Chương trình sau đây hiển thị std :: cout cắt ngắn thành 6 chữ số:

    Chương trình này xuất ra:

    9.87654 987.654 987654 9.87654e+006 9.87654e-005

    Lưu ý rằng mỗi trong số này chỉ có 6 chữ số có nghĩa hay chỉ có 6 chữ số được in ra.

    Cũng lưu ý rằng std :: cout sẽ chuyển sang xuất số theo ký hiệu khoa học trong một số trường hợp(số đó quá lớn). Tùy thuộc vào trình biên dịch, số mũ thường sẽ được đệm đến một số chữ số tối thiểu. Đừng sợ, 9,87654e + 006 giống như 9,87654e6. Số chữ số mũ tối thiểu được hiển thị là dành riêng cho trình biên dịch (Visual Studio sử dụng 3, một số khác sử dụng 2 theo tiêu chuẩn C99).

    Số chữ số của độ chính xác của biến số dấu phẩy động phụ thuộc vào cả kích thước (số float có độ chính xác thấp hơn gấp đôi) và giá trị cụ thể được lưu trữ (một số giá trị có độ chính xác cao hơn các giá trị khác). Giá trị float có độ chính xác từ 6 đến 9 chữ số, với hầu hết các giá trị float có ít nhất 7 chữ số có nghĩa. Giá trị double có độ chính xác từ 15 đến 18 chữ số, với hầu hết các giá trị double có ít nhất 16 chữ số có nghĩa. Long double có độ chính xác tối thiểu là 15, 18 hoặc 33 chữ số có nghĩa tùy thuộc vào số lượng byte chiếm.

    Chúng ta có thể ghi đè độ chính xác mặc định mà std :: cout hiển thị bằng cách sử dụng hàm std :: setpcision () được xác định trong tiêu đề iomanip.

    Outputs:

    3.333333253860474 3.333333333333334

    Vì chúng ta đặt độ chính xác thành 16 chữ số, mỗi số ở trên được in 16 chữ số. Nhưng, như bạn có thể thấy, những con số chắc chắn có thể chính xác đến 16 chữ số!

    Các vấn đề chính xác không chỉ có tác động đến các số phân số, chúng còn tác động đến bất kỳ số nào có quá nhiều chữ số có nghĩa. Hãy xem xét một số lượng lớn:

    Output:

    123456792 lớn hơn 123456789. Giá trị 123456789.0 có 10 chữ số có nghĩa, nhưng giá trị float thường có 7 chữ số chính xác (và kết quả của 123456792 chỉ chính xác đến 7 chữ số có nghĩa). Chúng ta đã mất độ chính xác của một số! Khi độ chính xác bị mất vì một số chỉ có thể được lưu trữ được như vậy thôi thì đây được gọi là lỗi làm tròn.

    Do đó, người ta phải cẩn thận khi sử dụng các số dấu phẩy động đòi hỏi độ chính xác cao.

    Thực hành tốt nhất ở đây là Ưu tiên sử dụng double so với float khi cần không gian ở mức cao, vì sự thiếu chính xác trong float thường sẽ dẫn đến kết quả không chính xác.

    4. Lỗi làm tròn trong các phép so sánh dấu phẩy động

    Số dấu phẩy động rất khó để làm việc do sự khác biệt không rõ ràng giữa số nhị phân (cách lưu trữ dữ liệu) và số thập phân (cách chúng ta thấy). Xét phân số 1/10. Trong phần thập phân, số này dễ dàng được biểu thị bằng 0,1 và chúng ta thường nghĩ 0,1 là một số dễ biểu thị với 1 chữ số có nghĩa. Tuy nhiên, trong hệ nhị phân, 0,1 được biểu thị bằng chuỗi vô hạn: 0,00011001100110011 Bằng cách này, khi chúng ta gán 0,1 cho một số dấu phẩy động, chúng ta sẽ gặp vấn đề về độ chính xác.

    Bạn có thể thấy tác dụng của việc này trong chương trình sau:

    Kết quả:

    0.1 0.10000000000000001

    Trên dòng trên cùng, std :: cout in 0.1, như chúng ta mong đợi.

    Ở dòng dưới cùng, nơi chúng ta có std :: cout cho chúng ta thấy 17 chữ số chính xác, chúng ta thấy rằng d thực sự không hoàn toàn 0,1! Điều này là do double phải cắt ngắn xấp xỉ do bộ nhớ hạn chế của nó. Kết quả là một số chính xác đến 16 chữ số, nhưng số này không chính xác 0,1. Lỗi làm tròn có thể làm cho một số nhỏ hơn hoặc lớn hơn một chút, tùy thuộc vào nơi xảy ra cắt ngắn.

    Lỗi làm tròn có thể có hậu quả không mong muốn:

    1 0.99999999999999989

    Một lưu ý cuối cùng về lỗi làm tròn: các phép toán (như cộng và nhân) có xu hướng làm cho lỗi làm tròn tăng lên. Vì vậy, mặc dù 0,1 có lỗi làm tròn ở chữ số có nghĩa thứ 17, nhưng khi chúng ta thêm 0,1 mười lần, lỗi làm tròn đã len lỏi vào chữ số có nghĩa thứ 16. Các hoạt động liên tục sẽ khiến lỗi này ngày càng trở nên nghiêm trọng hơn.

    Một hệ quả của quy tắc này là: không bao giờ sử dụng số dấu phẩy động cho dữ liệu tài chính hoặc tiền tệ.

    Có hai loại số dấu phẩy động đặc biệt. Đầu tiên là Inf, đại diện cho vô cùng. Inf có thể tích cực hoặc tiêu cực. Thứ hai là NaN, viết tắt của cụm từ “Not a Number”. Có một số loại NaN khác nhau.

    Ở đây, một chương trình hiển thị cả ba:

    Và kết quả khi sử dụng Visual Studio 2008 trên Windows:

    1.#INF -1.#INF 1.#IND

    INF là viết tắt của infinity(vô cùng), và IND là viết tắt của indeterminate(không xác định). Lưu ý rằng kết quả in ra Inf và NaN tuỳ vào từng nền tảng cụ thể, vì vậy kết quả của bạn có thể thay đổi.

    Tóm lại, hai điều bạn nên nhớ về số dấu phẩy động:

    1) Số dấu phẩy động rất hữu ích để lưu trữ các số rất lớn hoặc rất nhỏ, bao gồm cả các số có thành phần phân số.

    2) Số dấu phẩy động thường có sai số làm tròn nhưng khá nhỏ, ngay cả khi số có ít chữ số có nghĩa(ít chữ số được hiển thị). Thường thì chúng ta không chú ý tới nó vì chúng quá nhỏ và vì các số bị cắt bớt khi được in ra. Tuy nhiên, so sánh các số dấu phẩy động có thể không cho ra kết quả như mong đợi. Thực hiện các phép toán trên các giá trị này sẽ khiến các lỗi làm tròn ngày càng lớn hơn.

    --- Bài cũ hơn ---

  • Tiền Khai Báo Và Định Nghĩa Hàm (Forward Declarations And Definitions Of Functions)
  • Cách Cài Đặt Stack Có Sử Dụng Template Trong Ngôn Ngữ C++
  • Cách Cài Đặt Queue Có Sử Dụng Template Trong Sử Dụng Code C++
  • Sử Dụng Template Trong C++ Thế Nào (Phần 1)
  • Hướng Dẫn Các Cách Tính Tuổi Từ Ngày Sinh Trong Excel
  • C++ — Câu Lệnh “return {}” Có Nghĩa Gì Trong C ++ 11?

    --- Bài mới hơn ---

  • Giá Trị (Values) Và Tham Chiếu (References)
  • Thuật Toán Sắp Xếp Trong C++
  • Lập Trình C: Hàm Xử Lý Chuỗi (String)
  • Hướng Dẫn Và Ví Dụ C/c++ String
  • Chuỗi Ký Tự Trong C
  • return {}; biểu thị “trả về một đối tượng của kiểu trả về của hàm được khởi tạo với một khoảng trống trình khởi tạo danh sách “. Hành vi chính xác phụ thuộc vào loại đối tượng được trả về.

    Từ chúng tôi (vì OP được gắn thẻ C++ 11, tôi đã loại trừ các quy tắc trong C++ 14 và C++ 17; tham khảo liên kết để biết thêm chi tiết):

    • Nếu danh sách braces-init-trống và T là loại lớp có hàm tạo mặc định, việc khởi tạo giá trị được thực hiện.
    • Mặt khác, nếu T là loại tổng hợp, khởi tạo tổng hợp được thực hiện.
    • Mặt khác, nếu T là một chuyên môn của std :: initizer_list, thì đối tượng T được khởi tạo trực tiếp hoặc khởi tạo sao chép, tùy thuộc vào ngữ cảnh, từ danh sách braces-init-list.
    • Mặt khác, các hàm tạo của T được xem xét, theo hai giai đoạn:

      • Tất cả các hàm tạo lấy std :: initizer_list làm đối số duy nhất hoặc làm đối số đầu tiên nếu các đối số còn lại có giá trị mặc định, được kiểm tra và khớp với độ phân giải quá tải đối với một đối số kiểu std :: initizer_list
      • Nếu giai đoạn trước không tạo ra sự trùng khớp, tất cả các nhà xây dựng của T tham gia giải quyết quá tải đối với tập hợp các đối số bao gồm các thành phần của danh sách khởi tạo, với hạn chế chỉ cho phép chuyển đổi không thu hẹp. Nếu giai đoạn này tạo ra một hàm tạo rõ ràng là kết hợp tốt nhất cho khởi tạo danh sách sao chép, thì quá trình biên dịch không thành công (lưu ý, trong khởi tạo sao chép đơn giản, các hàm tạo rõ ràng hoàn toàn không được xem xét).
    • Mặt khác (nếu T không phải là loại lớp), nếu danh sách braces-init-list chỉ có một phần tử và T không phải là loại tham chiếu hoặc là loại tham chiếu tương thích với loại phần tử, T là trực tiếp- khởi tạo (trong khởi tạo danh sách trực tiếp) hoặc khởi tạo sao chép (trong khởi tạo danh sách sao chép), ngoại trừ việc thu hẹp chuyển đổi không được phép.

    • Mặt khác, nếu T là loại tham chiếu không tương thích với loại phần tử. (điều này không thành công nếu tham chiếu là tham chiếu lvalue không const)
    • Mặt khác, nếu danh sách braces-init-list không có phần tử, T được khởi tạo giá trị.

    Trước C++ 11, đối với một hàm trả về std::string, bạn sẽ viết:

    std::string get_string() { return std::string(); }

    Sử dụng cú pháp cú đúp trong C++ 11, bạn không cần lặp lại kiểu:

    std::string get_string() { return {}; // an empty string is returned }

    return NULLreturn nullptr nên được sử dụng khi hàm trả về loại con trỏ:

    any_type* get_pointer() { return nullptr; }

    Tuy nhiên, NULL không được dùng nữa từ C++ 11 vì nó chỉ là bí danh cho một giá trị nguyên (0), trong khi nullptr là loại con trỏ thực:

    int get_int() { return NULL; // will compile, NULL is an integer } int get_int() { return nullptr; // error: nullptr is not an integer }

    --- Bài cũ hơn ---

  • Giới Thiệu Về Con Trỏ(Pointers) Trong C++
  • Truyền Giá Trị Cho Hàm (Passing Arguments By Value)
  • 14 Hợp Âm Piano Cơ Bản, Hướng Dẫn Cách Bấm Chi Tiết
  • Cách Đọc Nốt Nhạc Piano Cho Người Mới Học Nhạc
  • Tìm Hiểu Vị Trí Các Nốt Nhạc Trên Phím Đàn Piano
  • Class C Là Gì Và Ý Nghĩa Của Class C (Ipv4) Trong Seo

    --- Bài mới hơn ---

  • Ipv6 Là Gì? Cách Đổi Địa Chỉ Ipv4 Sang Ipv6 Và Ngược Lại
  • Input Là Gì? Giải Thích Và Định Nghĩa Input
  • Input, Output Và Outcome Của Sản Phẩm Là Gì?
  • Bài Toán Và Thuật Toán
  • Làm Việc Vào Ra Dữ Liệu Input Và Output Trong Lập Trình C/c++
  • Bài viết này mình đã tìm hiểu rất kỹ các khái niệm Class A-B-C-D, IPv4… Ảnh hưởng của chúng đến việc chọn hosting SEO để chuẩn bị cho dự án xây dựng hệ thống 30 PBN cực kì tâm huyết và tốn kém của mình.

    IPv4 – IPv6 ???

    IPv4 là Giao thức Internet phiên bản 4 (viết tắt IPv4, từ tiếng Anh Internet Protocol version 4) là phiên bản thứ tư trong quá trình phát triển của các giao thức Internet (Internet Protocol). Đây là phiên bản đầu tiên của IP được sử dụng rộng rãi. Hiện tại, IPv4 vẫn là giao thức được triển khai rộng rãi nhất trong bộ giao thức của lớp internet. IPv6 (giao thức Internet phiên bản 6) hiện cũng đã được triển khai nhưng chưa phổ biến.

    1 địa chỉ IPv4 sẽ có cấu trúc 4 lớp (Class) phân tách mỗi lớp bằng dấu chấm, thứ tự là

    Mỗi tên miền là một địa chỉ IP

    Các thiết bị mạng bản chất vẫn sử dụng IP để giao tiếp với nhau. Tuy nhiên người dùng sẽ RẤT khó khăn để có thể nhớ địa chỉ IP này (Có thể nói là không nhớ được). Để giải quyết vấn đề này, hệ thống tên miền (DNS: Domain Name System – Domain name server) ra đời. Có thể xem DNS có cấu trúc gồm hai cột, một cột là địa chỉ IP, cột còn lại là tên miền. Khi người dùng gõ một tên miền vào trình duyệt, tên miền này sẽ được gửi đến một máy chủ DNS để “dịch” tên miền này sang địa chỉ IP, là địa chỉ được sử dụng để các thiết bị mạng giao tiếp với nhau. Như vậy việc truy cập giữa các thiết bị mạng sẽ trở nên dễ dàng hơn.

    Chỉ với giải pháp này, hiện nay việc sử dụng website trở nên phổ biến, Email và rất nhiều các dịch vụ khác cũng “ăn theo” Domain Name System này.

    Chọn Hosting SEO khác Class C của IP

    Nghe có vẻ loằng ngoằng nên mình sẽ cố giải thích để các bạn hiểu.

    Câu chuyện bắt đầu bằng việc Google không chấp nhận thậm chí là “dùng mọi cách” để ngăn chặn việc người dùng cố tình thao túng kết quả xếp hạng của google (SEO). Anh em làm SEO thì luôn “dùng mọi thủ đoạn” để có kết quả tốt hơn trong bảng xếp hạng này. Vì thế cả 2 bên đều hiểu các phương pháp SEO phổ biến là xây dựng hệ thống vệ tinh để bắn link về money site.

    Khi xây dựng vệ tinh, để giảm chi phí, anh em thường dùng chung hosting cho các site vệ tinh này thậm chí cả site chính và GG nhận biết việc anh em sở hữu nhiều trang web vệ tinh bằng rất nhiều dấu hiệu (footprint) trong đó dễ nhận biết nhất đó là xây dựng liên kết giữa các trang trùng hoặc “gần trùng” dải IP.

    Một vài lời khuyên và kết luận

    Đến đây, hy vọng anh em đã hiểu sơ bộ về IPv4, Class C và ảnh hưởng của chúng đến SEO.

    Kết luận: Tuyệt đối không được bắn link từ 2 vệ tinh cùng IP về 1 money site

    Với hosting:

    • Tuyệt đối không được trùng IP.
    • Không nên dùng host cùng nhà cung cấp. Nếu dùng chung thì phải khác gói host, khác Class C và không nên đặt quá 3 site.

    Với Domain

    • Khác tên đăng ký.
    • Khác địa chỉ.
    • Khác số điện thoại đăng ký.
    • Khác email đăng ký.
    • Khác nhà cung cấp tên miền ngoại trừ một vài nhà cung cấp quá lớn như:

    Vui lòng ghi nguồn chúng tôi nếu copy từ trang này!

    Chân thành cám ơn!

    --- Bài cũ hơn ---

  • Tìm Hiểu Về Ipv4 (Phần 1)
  • Ip Khác Class C Là Gì? Cấu Trúc Của Ipv4
  • Các Câu Hỏi Đáp Về Địa Chỉ Ipv4
  • Ipv4 Là Gì? Ưu Nhược Điểm Của Ipv4
  • Bài 16. Khái Niệm Về Liên Kết Hoá Học. Liên Kết Ion
  • Namespace Trong C# Là Gì? Định Nghĩa Và Cú Pháp

    --- Bài mới hơn ---

  • Namespace (Không Gian Tên) Trong C#
  • Cách Cài Đặt Danh Sách Liên Kết Đơn Sử Dụng Code C++
  • Bạn Hiểu Gì Về Danh Sách Liên Kết Đơn Trong C++
  • Sự Ra Đời Của Phương Thức Khởi Tạo (Constructor), Phương Thức Hủy (Destructor) Trong Một Class
  • Tìm Hiểu Tính Đa Hình Trong C#
  • Namespace trong C# là gì?

    Có thể hiểu nôm na, Namespace là một cách để phân nhóm tập hợp các tên (chẳng hạn như tên lớp) khác với các tập hợp tên khác. Ưu điểm lớn nhất khi sử dụng Namespace là tên các lớp được khai báo trong namespace này không bị xung đột với tên các lớp khác có cùng tên được khai báo trong namespace khác.

    Ngoài ra namespace còn được hiểu là một nhóm các lớp có đặc điểm chung. Các thành viên của namespace có thể là namespace, interface, cấu trúc (structure), và delegate.

    Các thành viên của namespace được truy cập bằng cách sử dụng toán tử (.). Một lớp đầy đủ trong C# bao gồm cả namespace tương ứng của nó.

    3.1 Cú pháp truy cập thành viên của Namespace

    Cú pháp truy cập thành viên của Namespace có dạng:

    Lưu ý:

    – 2 lớp có cùng tên có thể được tạo từ 2 namespace khác nhau trong cùng một chương trình.

    – Trong một namespace, không thể có 2 lớp cùng tên.

    – Trong C#, tên đầy đủ của lớp bắt đầu từ tên namespace của nó, theo sau là toán tử (.) và tên lớp, được gọi là tên đầy đủ của lớp.

    3.2. Ví dụ về truy cập thành viên của Namespace

    // C# program to illustrate the

    // name_1 namespace members

    // function of class Taimienphi.vn_1

    public static void display()

    // Here System is the namespace

    // under which Console class is defined

    // You can avoid writing System with

    // the help of “using” keyword discussed

    System.Console.WriteLine(“Hello Taimienphi.vn!”);

    because no two classes can have the

    same name under a single namespace

    } // ending of first namespace

    public static void Main(String args)

    // calling the display method of

    // class Taimienphi.vn_1 by using only one

    // dot operator as display is the

    // static method of class Taimienphi.vn_1

    Taimienphi.vn_1 .display();

    Kết quả đầu ra có dạng:

    Hello Doisonggiaitri.com

    5. Namespace lồng nhau (Nested Namespace)

    Ngoài ra bạn có thể định nghĩa một namespace bên trong một namespace khác được gọi là namespace lồng nhau (hay Nested Namespace). Để truy cập các thành viên của namespace lồng nhau, chúng ta sử dụng toán tử (.).

    Cho ví dụ, Generic là namespace lồng nhau trong nhóm namespace có dạng System.Collections.Generic.

    Kết quả đầu ra có dạng: Nested Namespace Constructor

    --- Bài cũ hơn ---

  • Virtual Tables (Vtable) Trong C++
  • Design Pattern: Tìm Hiểu Về Factory Method, Code C++
  • Bài 5: Static Trong Hướng Đối Tượng C++
  • Makefile (Tạo Phụ Thuộc Tự Động)
  • Các Ký Hiệu Makefile $ @ Và $
  • Dấu Chấm Trong Comment Có Ý Nghĩa Gì

    --- Bài mới hơn ---

  • Chức Năng 11 Dấu Câu Trong Tiếng Việt
  • Nêu Ý Nghĩa Của Biến Dị Tổ Hợp Với Chọn Giống Và Tiến Hóa
  • Tìm Hiểu Về Cross Entropy Loss Là Gì
  • Ý Nghĩa Của Phong Cách Thiết Kế Eco Cho Trang Trí Nội Thất
  • Vé Máy Bay Hạng Economy Là Gì?
  • Thông thường, dấu chấm xuất hiện khi người viết bài viết nhằm mục đích tìm người, tìm địa chỉ, cần giúp đỡ gì đó. Có khi thông tin mang tính chất chia buồn cũng có thể xuất hiện các dấu chấm.

    Những người viết bài với mục đích tìm kiếm điều gì thông thường hay chủ động ghi thêm “các bạn đi qua cho xin một chấm để không bị trôi bài”, đôi khi là người dùng sẽ tự hiểu.

    Là ký hiệu ước lệ cho một kết thúc.

    Là phần tử cuối cùng có sức mạnh khép lại một quãng, một khoảng, một dòng chảy của sự vật.

    Là sự chấm hết một ý, một câu văn, một đoạn thơ và có thể là cả một cuộc tình.

    Dấu chấm.

    Thật sự rất bé nhỏ. Chỉ là một điểm “.” – giản đơn, dung dị nhưng ý nghĩa của nó không dừng lại ở sự đóng kín cổ hủ.

    Có lẽ rất ít ai biết được.

    Dấu chấm còn là… sự khởi đầu cho một câu mới, đoạn mới, những ý tưởng còn đang nung nấu.

    Là sự bắt đầu cho một cuộc sống mới, một bước đi mới cho tương lai.

    Là sự tiếp diễn cho những điều tốt đẹp.

    Và còn là sự sống dậy của một tình yêu tưởng chừng như đã lụi tàn, đã khô héo…

    Thật bất ngờ và thú vị: “dấu chấm” là một khởi đầu.

    Không chỉ mang nghĩa chấm dứt mà còn là gợi mở.

    Vừa là dừng lại vừa là tiếp diễn.

    Hoàn tất để tạo dựng những điều mới lạ.

    Cuộc sống chính là quãng thời gian nối với nhau bằng những dấu chấm.

    Có những thứ đã qua nên được gói lại để đặt dấu bắt đầu.

    Có những điều thuộc về quá khứ, ta hãy đặt dấu chấm cho chúng, để chúng ngủ thật yên sau bao lần trỗi dậy đầy đớn đau.

    Và rồi sau đó, sẽ lại có những điều mới lạ tìm đến, mở rộng vòng tay chào đón Hãy sống như vậy để không bao giờ là kết thúc!

    Sống mạnh mẽ, biết đặt dấu chấm đúng lúc thì mọi thứ rồi đây đều tốt đẹp cả.

    Thế giới vốn dĩ rất muôn màu, ta hãy biết dừng lại đúng lúc trước bao sự đổi dời do nó mang lại. Hãy luôn coi dấu chấm là để bắt đầu thì mọi thứ sẽ dễ dàng vượt qua.

    --- Bài cũ hơn ---

  • Ý Nghĩa Hình Xăm Dreamcatcher Có Gì Bí Mật? Hãy Cùng Tìm Hiểu
  • Dreamcatcher Là Gì? Ý Nghĩa Của Dreamcatcher
  • Dành Tặng Dreamcatcher Đẹp Ý Nghĩa Cho Người Thân
  • Nghị Luận Về Ý Nghĩa Của Lối Sống Giản Dị
  • Sống Giản Dị Là Gì? Biểu Hiện Của Cách Sống Giản Dị Và Ý Nghĩa To Lớn
  • Web hay
  • Links hay
  • Guest-posts
  • Push
  • Chủ đề top 10
  • Chủ đề top 20
  • Chủ đề top 30
  • Chủ đề top 40
  • Chủ đề top 50
  • Chủ đề top 60
  • Chủ đề top 70
  • Chủ đề top 80
  • Chủ đề top 90
  • Chủ đề top 100
  • Bài viết top 10
  • Bài viết top 20
  • Bài viết top 30
  • Bài viết top 40
  • Bài viết top 50
  • Bài viết top 60
  • Bài viết top 70
  • Bài viết top 80
  • Bài viết top 90
  • Bài viết top 100
  • Chủ đề top 10
  • Chủ đề top 20
  • Chủ đề top 30
  • Chủ đề top 40
  • Chủ đề top 50
  • Chủ đề top 60
  • Chủ đề top 70
  • Chủ đề top 80
  • Chủ đề top 90
  • Chủ đề top 100
  • Bài viết top 10
  • Bài viết top 20
  • Bài viết top 30
  • Bài viết top 40
  • Bài viết top 50
  • Bài viết top 60
  • Bài viết top 70
  • Bài viết top 80
  • Bài viết top 90
  • Bài viết top 100